diff --git a/packages/evm/.env.sample b/packages/evm/.env.sample
index 9ec3628..aed0018 100644
--- a/packages/evm/.env.sample
+++ b/packages/evm/.env.sample
@@ -3,5 +3,7 @@ AXIA=0x3F4C47E37A94caeE31d0B585f54F3fFA1f2294C9
SOLVER=0xE0D76433Edd9f5df370561bd0AF231E72c83Cd3a
VALIDATOR=0xc76B16fA2Fa75D93e08099DC16413D9a083404A1
+SETTLER_PROXY=
+
ETHERSCAN_KEY=
DEPLOYER_PRIVATE_KEY=
diff --git a/packages/evm/contracts/Intents.sol b/packages/evm/contracts/Intents.sol
index 00afb1a..455e84d 100644
--- a/packages/evm/contracts/Intents.sol
+++ b/packages/evm/contracts/Intents.sol
@@ -3,27 +3,19 @@
pragma solidity ^0.8.20;
/**
- * @dev Enum representing the type of intent operation.
- * - Swap: Swap tokens between chains or tokens.
+ * @dev Enum representing the operation type.
+ * - Swap: Swap tokens in the same chain.
* - Transfer: Transfer tokens to one or more recipients.
* - Call: Execute arbitrary contract calls.
+ * - CrossChainSwap: Swap tokens between chains.
+ * - DynamicCall: Execute arbitrary dynamic contract calls.
*/
enum OpType {
Swap,
Transfer,
- Call
-}
-
-/**
- * @dev Execution structure.
- * @param intent Intent to be fulfilled.
- * @param proposal Proposal to be executed.
- * @param signature Proposal signature.
- */
-struct Execution {
- Intent intent;
- Proposal proposal;
- bytes signature;
+ Call,
+ CrossChainSwap,
+ DynamicCall
}
/**
@@ -35,31 +27,41 @@ struct Validation {
}
/**
- * @dev General intent structure used to abstract over different intent types.
- * @param op The type of operation this intent represents.
- * @param user The originator of the intent.
+ * @dev General intent structure with different operations.
+ * @param feePayer The payer of the intent.
* @param settler The address responsible for executing the intent on-chain.
* @param nonce A unique value used to prevent replay attacks and distinguish intents.
* @param deadline The timestamp by which the intent must be executed.
- * @param data ABI-encoded data representing a specific intent type (e.g. SwapIntent, TransferIntent, CallIntent).
- * @param maxFees List of max fees the user is willing to pay for the intent.
- * @param events List of custom intent events to be emitted.
- * @param configSig The signature of the configuration that this intent belongs to
+ * @param maxFees List of max fees the feePayer is willing to pay for the intent.
+ * @param triggerSig The signature of the trigger that this intent belongs to
* @param minValidations The minimum number of validator approvals required for this intent to be considered valid.
* @param validations The list validator signatures attesting to this intent.
+ * @param operations List of operations of the intent.
*/
struct Intent {
- uint8 op;
- address user;
+ address feePayer;
address settler;
bytes32 nonce;
uint256 deadline;
- bytes data;
MaxFee[] maxFees;
- IntentEvent[] events;
- bytes configSig;
+ bytes triggerSig;
uint256 minValidations;
bytes[] validations;
+ Operation[] operations;
+}
+
+/**
+ * @dev Operation structure used to abstract over different operation types.
+ * @param opType The type of operation this operation represents.
+ * @param user The user of the operation.
+ * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).
+ * @param events List of custom operation events to be emitted.
+ */
+struct Operation {
+ uint8 opType;
+ address user;
+ bytes data;
+ OperationEvent[] events;
}
/**
@@ -73,23 +75,23 @@ struct MaxFee {
}
/**
- * @dev Intent event representation.
+ * @dev Operation event representation.
* @param topic Event topic to be emitted.
* @param data Event data to be emitted.
*/
-struct IntentEvent {
+struct OperationEvent {
bytes32 topic;
bytes data;
}
/**
- * @dev Represents a swap intent between two chains.
+ * @dev Represents a swap operation between two chains.
* @param sourceChain Chain ID where tokens will be sent from.
* @param destinationChain Chain ID where tokens will be received.
* @param tokensIn List of input tokens and amounts to swap.
* @param tokensOut List of expected output tokens, minimum amounts, and recipients.
*/
-struct SwapIntent {
+struct SwapOperation {
uint256 sourceChain;
uint256 destinationChain;
TokenIn[] tokensIn;
@@ -119,11 +121,11 @@ struct TokenOut {
}
/**
- * @dev Represents a transfer intent containing multiple token transfers.
+ * @dev Represents a transfer operation containing multiple token transfers.
* @param chainId Chain ID where the transfers should be executed.
* @param transfers List of token transfers to be performed.
*/
-struct TransferIntent {
+struct TransferOperation {
uint256 chainId;
TransferData[] transfers;
}
@@ -141,11 +143,11 @@ struct TransferData {
}
/**
- * @dev Represents a generic call intent consisting of one or more contract calls.
+ * @dev Represents a generic call operation consisting of one or more contract calls.
* @param chainId Chain ID where the calls should be executed.
* @param calls List of low-level contract calls to be executed.
*/
-struct CallIntent {
+struct CallOperation {
uint256 chainId;
CallData[] calls;
}
@@ -162,21 +164,31 @@ struct CallData {
uint256 value;
}
+/**
+ * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.
+ * @param chainId Chain ID where the calls should be executed.
+ * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.
+ */
+struct DynamicCallOperation {
+ uint256 chainId;
+ bytes[] calls;
+}
+
/**
* @dev Generic proposal structure representing a solver’s response to an intent.
* @param deadline Timestamp until when the proposal is valid.
- * @param data ABI-encoded proposal-specific data (e.g. SwapProposal).
+ * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).
* @param fees List of fee amounts the solver requires for execution.
*/
struct Proposal {
uint256 deadline;
- bytes data;
+ bytes[] datas;
uint256[] fees;
}
/**
- * @dev Swap proposal representation for a swap intent.
- * @param executor Address of the executor contract that should be called during intent execution.
+ * @dev Swap proposal representation for a swap operation.
+ * @param executor Address of the executor contract that should be called during operation execution.
* @param data Arbitrary data used to call the executor contract.
* @param amountsOut List of amounts of tokens out proposed by the solver.
*/
@@ -189,33 +201,34 @@ struct SwapProposal {
library IntentsHelpers {
bytes32 internal constant INTENT_TYPE_HASH =
keccak256(
- 'Intent(uint8 op,address user,address settler,bytes32 nonce,uint256 deadline,bytes data,MaxFee[] maxFees,IntentEvent[] events,bytes configSig,uint256 minValidations)IntentEvent(bytes32 topic,bytes data)MaxFee(address token,uint256 amount)'
+ 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'
);
bytes32 internal constant PROPOSAL_TYPE_HASH =
- keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes data,uint256[] fees)');
+ keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');
bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');
bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');
- bytes32 internal constant INTENT_EVENT_TYPE_HASH = keccak256('IntentEvent(bytes32 topic,bytes data)');
+ bytes32 internal constant OPERATION_TYPE_HASH =
+ keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');
+
+ bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');
function hash(Intent memory intent) internal pure returns (bytes32) {
return
keccak256(
abi.encode(
INTENT_TYPE_HASH,
- intent.op,
- intent.user,
+ intent.feePayer,
intent.settler,
intent.nonce,
intent.deadline,
- keccak256(intent.data),
hash(intent.maxFees),
- hash(intent.events),
- intent.configSig,
- intent.minValidations
+ intent.triggerSig,
+ intent.minValidations,
+ hash(intent.operations)
)
);
}
@@ -228,7 +241,7 @@ library IntentsHelpers {
hash(intent),
solver,
proposal.deadline,
- keccak256(proposal.data),
+ hash(proposal.datas),
hash(proposal.fees)
)
);
@@ -242,10 +255,29 @@ library IntentsHelpers {
return keccak256(abi.encodePacked(hashes));
}
- function hash(IntentEvent[] memory events) internal pure returns (bytes32) {
+ function hash(Operation[] memory operations) internal pure returns (bytes32) {
+ bytes32[] memory hashes = new bytes32[](operations.length);
+ for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);
+ return keccak256(abi.encodePacked(hashes));
+ }
+
+ function hash(Operation memory operation) internal pure returns (bytes32) {
+ return
+ keccak256(
+ abi.encode(
+ OPERATION_TYPE_HASH,
+ operation.opType,
+ operation.user,
+ keccak256(operation.data),
+ hash(operation.events)
+ )
+ );
+ }
+
+ function hash(OperationEvent[] memory events) internal pure returns (bytes32) {
bytes32[] memory hashes = new bytes32[](events.length);
for (uint256 i = 0; i < events.length; i++) {
- hashes[i] = keccak256(abi.encode(INTENT_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));
+ hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));
}
return keccak256(abi.encodePacked(hashes));
}
@@ -254,6 +286,14 @@ library IntentsHelpers {
return keccak256(abi.encodePacked(fees));
}
+ function hash(bytes[] memory datas) internal pure returns (bytes32) {
+ bytes32[] memory hashes = new bytes32[](datas.length);
+ for (uint256 i = 0; i < datas.length; i++) {
+ hashes[i] = keccak256(datas[i]);
+ }
+ return keccak256(abi.encodePacked(hashes));
+ }
+
function hash(Validation memory validation) internal pure returns (bytes32) {
return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));
}
diff --git a/packages/evm/contracts/Settler.sol b/packages/evm/contracts/Settler.sol
index 8ebbc39..8a30061 100644
--- a/packages/evm/contracts/Settler.sol
+++ b/packages/evm/contracts/Settler.sol
@@ -14,17 +14,18 @@
pragma solidity ^0.8.20;
-import '@openzeppelin/contracts/access/Ownable.sol';
+import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';
+import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';
+import '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';
+import '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
-import '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
-import '@openzeppelin/contracts/utils/cryptography/EIP712.sol';
-import '@openzeppelin/contracts/utils/introspection/ERC165Checker.sol';
import './Intents.sol';
import './interfaces/IController.sol';
-import './interfaces/IIntentsValidator.sol';
+import './interfaces/IDynamicCallEncoder.sol';
+import './interfaces/IOperationsValidator.sol';
import './interfaces/IExecutor.sol';
import './interfaces/ISettler.sol';
import './utils/Denominations.sol';
@@ -36,7 +37,7 @@ import './smart-accounts/SmartAccountsHandlerHelpers.sol';
* @title Settler
* @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents
*/
-contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
+contract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {
using SafeERC20 for IERC20;
using IntentsHelpers for Intent;
using IntentsHelpers for Proposal;
@@ -44,17 +45,19 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
using SmartAccountsHandlerHelpers for address;
// Mimic controller reference
- // solhint-disable-next-line immutable-vars-naming
- address public immutable override controller;
+ address public override controller;
// Smart accounts handler reference
address public override smartAccountsHandler;
- // Intents validator reference
- address public override intentsValidator;
+ // Operations validator reference
+ address public override operationsValidator;
- // List of block numbers at which a user nonce was used
- mapping (address => mapping (bytes32 => uint256)) public override getNonceBlock;
+ // Dynamic call encoder reference
+ address public dynamicCallEncoder;
+
+ // List of block numbers at which an intent was executed
+ mapping (bytes32 => uint256) public override getIntentBlock;
// Safeguard config per user
mapping (address => bytes) internal _userSafeguard;
@@ -69,13 +72,26 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
}
/**
- * @dev Creates a new Settler contract
+ * @dev Disables initializers to prevent implementation contract from being initialized directly
+ */
+ constructor() {
+ _disableInitializers();
+ }
+
+ /**
+ * @dev Initializes a new Settler contract
* @param _controller Address of the Settler controller
* @param _owner Address that will own the contract
+ * @param _dynamicCallEncoder Address of the dynamic call encoder
*/
- constructor(address _controller, address _owner) Ownable(_owner) EIP712('Mimic Protocol Settler', '1') {
+ function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {
+ __Ownable_init(_owner);
+ __ReentrancyGuard_init();
+ __EIP712_init('Mimic Protocol Settler', '1');
+
controller = _controller;
smartAccountsHandler = address(new SmartAccountsHandler());
+ _setDynamicCallEncoder(_dynamicCallEncoder);
}
/**
@@ -138,11 +154,19 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
}
/**
- * @dev Sets a new intents validator address
- * @param newIntentsValidator New intents validator to be set
+ * @dev Sets a new operations validator address
+ * @param newOperationsValidator New operations validator to be set
*/
- function setIntentsValidator(address newIntentsValidator) external override onlyOwner {
- _setIntentsValidator(newIntentsValidator);
+ function setOperationsValidator(address newOperationsValidator) external override onlyOwner {
+ _setOperationsValidator(newOperationsValidator);
+ }
+
+ /**
+ * @dev Sets a new dynamic call encoder address
+ * @param newDynamicCallEncoder New dynamic call encoder to be set
+ */
+ function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {
+ _setDynamicCallEncoder(newDynamicCallEncoder);
}
/**
@@ -155,129 +179,212 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
/**
* @dev Executes a proposal to fulfill an intent
- * @param executions List of executions, each including the intent, proposal, and proposal signature
+ * @param intent Intent to be fulfilled
+ * @param proposal Proposal to be executed
+ * @param signature Proposal signature
*/
- function execute(Execution[] memory executions) external override onlySolver {
- _execute(executions, false);
+ function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)
+ external
+ override
+ onlySolver
+ {
+ _execute(intent, proposal, signature, false);
}
/**
* @dev Simulates an execution. It will always revert. Successful executions are returned as
* `SettlerSimulationSuccess` errors. Any other error should be treated as failure.
- * @param executions List of executions, each including the intent, proposal, and proposal signature
+ * @param intent Intent to be fulfilled
+ * @param proposal Proposal to be executed
+ * @param signature Proposal signature
*/
- function simulate(Execution[] memory executions) external override onlySolver {
+ function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)
+ external
+ override
+ onlySolver
+ {
uint256 initialGas = gasleft();
- _execute(executions, true);
+ _execute(intent, proposal, signature, true);
uint256 gasUsed = initialGas - gasleft();
revert SettlerSimulationSuccess(gasUsed);
}
/**
* @dev Validates and executes a proposal to fulfill an intent
- * @param executions List of executions, each including the intent, proposal, and proposal signature
+ * @param intent Intent to be fulfilled
+ * @param proposal Proposal to be executed
+ * @param signature Proposal signature
* @param simulated Whether the execution is a simulation
*/
- function _execute(Execution[] memory executions, bool simulated) internal nonReentrant {
- for (uint256 i = 0; i < executions.length; i++) {
- Intent memory intent = executions[i].intent;
- Proposal memory proposal = executions[i].proposal;
- bytes memory signature = executions[i].signature;
+ function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)
+ internal
+ nonReentrant
+ {
+ _validateIntent(intent, proposal, signature, simulated);
+ getIntentBlock[intent.hash()] = block.number;
- _validateIntent(intent, proposal, signature, simulated);
- getNonceBlock[intent.user][intent.nonce] = block.number;
+ bytes[][] memory outputs = new bytes[][](intent.operations.length);
+ for (uint256 i = 0; i < intent.operations.length; i++) {
+ outputs[i] = _executeOperation(intent, proposal, i, outputs);
+ }
- if (intent.op == uint8(OpType.Swap)) _executeSwap(intent, proposal);
- else if (intent.op == uint8(OpType.Transfer)) _executeTransfer(intent, proposal);
- else if (intent.op == uint8(OpType.Call)) _executeCall(intent, proposal);
- else revert SettlerUnknownIntentType(uint8(intent.op));
+ _payFees(intent, proposal);
+ emit ProposalExecuted(proposal.hash(intent, _msgSender()));
+ }
- emit ProposalExecuted(proposal.hash(intent, _msgSender()), i);
+ /**
+ * @dev Executes proposal to fulfill an operation
+ * @param intent Intent being fulfilled
+ * @param proposal Proposal being executed
+ * @param index Position where the operation and its corresponding proposal data are located
+ * @param outputs List of operations outputs
+ */
+ function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)
+ internal
+ returns (bytes[] memory)
+ {
+ uint8 opType = intent.operations[index].opType;
+ if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {
+ return _executeSwap(intent, proposal, index);
}
+ if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);
+ if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);
+ if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);
+ revert SettlerUnknownOperationType(opType);
}
/**
- * @dev Validates and executes a proposal to fulfill a swap intent
- * @param intent Swap intent to be fulfilled
- * @param proposal Swap proposal to be executed
+ * @dev Validates and executes a proposal to fulfill a swap operation
+ * @param intent Intent that contains swap operation to be fulfilled
+ * @param proposal Proposal with swap data to be executed
+ * @param index Position where the swap proposal data and operation are located
*/
- function _executeSwap(Intent memory intent, Proposal memory proposal) internal {
- SwapIntent memory swapIntent = abi.decode(intent.data, (SwapIntent));
- SwapProposal memory swapProposal = abi.decode(proposal.data, (SwapProposal));
- _validateSwapIntent(swapIntent, swapProposal);
-
- bool isSmartAccount = smartAccountsHandler.isSmartAccount(intent.user);
- if (swapIntent.sourceChain == block.chainid) {
- for (uint256 i = 0; i < swapIntent.tokensIn.length; i++) {
- TokenIn memory tokenIn = swapIntent.tokensIn[i];
- _transferFrom(tokenIn.token, intent.user, swapProposal.executor, tokenIn.amount, isSmartAccount);
+ function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)
+ internal
+ returns (bytes[] memory outputs)
+ {
+ Operation memory operation = intent.operations[index];
+ SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));
+ SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));
+ if (operation.opType == uint8(OpType.CrossChainSwap)) {
+ if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();
+ _validateCrossChainSwapOperation(swapOperation, swapProposal);
+ } else _validateSingleChainSwapOperation(swapOperation, swapProposal);
+
+ bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);
+ if (swapOperation.sourceChain == block.chainid) {
+ for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {
+ TokenIn memory tokenIn = swapOperation.tokensIn[i];
+ _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);
}
}
- uint256[] memory preBalancesOut = _getTokensOutBalance(swapIntent);
- IExecutor(swapProposal.executor).execute(intent, proposal);
+ uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);
+ // Using the intent hash as the unique operation hash because cross-chain swap has only one operation per intent and the single swap executor does not use it
+ bytes32 operationHash = intent.hash();
+ IExecutor(swapProposal.executor).execute(operation, operationHash, proposal.datas[index]);
- if (swapIntent.destinationChain == block.chainid) {
- uint256[] memory outputs = new uint256[](swapIntent.tokensOut.length);
- for (uint256 i = 0; i < swapIntent.tokensOut.length; i++) {
- TokenOut memory tokenOut = swapIntent.tokensOut[i];
+ outputs = new bytes[](swapOperation.tokensOut.length);
+ if (swapOperation.destinationChain == block.chainid) {
+ uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);
+ for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {
+ TokenOut memory tokenOut = swapOperation.tokensOut[i];
uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));
uint256 preBalanceOut = preBalancesOut[i];
if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);
- outputs[i] = postBalanceOut - preBalanceOut;
+ amounts[i] = postBalanceOut - preBalanceOut;
uint256 proposedAmount = swapProposal.amountsOut[i];
- if (outputs[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, outputs[i], proposedAmount);
+ if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);
- ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, outputs[i]);
+ ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);
+ outputs[i] = abi.encode(amounts[i]);
}
- _emitIntentEvents(intent, proposal, abi.encode(outputs));
- _payFees(intent, proposal, isSmartAccount);
+ _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));
}
}
/**
- * @dev Validates and executes a proposal to fulfill a transfer intent
- * @param intent Transfer intent to be fulfilled
+ * @dev Validates and executes a proposal to fulfill a transfer operation
+ * @param intent Intent that contains transfer operation to be fulfilled
* @param proposal Transfer proposal to be executed
+ * @param index Position where the transfer proposal data and operation are located
*/
- function _executeTransfer(Intent memory intent, Proposal memory proposal) internal {
- TransferIntent memory transferIntent = abi.decode(intent.data, (TransferIntent));
- _validateTransferIntent(transferIntent, proposal);
-
- bool isSmartAccount = smartAccountsHandler.isSmartAccount(intent.user);
- for (uint256 i = 0; i < transferIntent.transfers.length; i++) {
- TransferData memory transfer = transferIntent.transfers[i];
- _transferFrom(transfer.token, intent.user, transfer.recipient, transfer.amount, isSmartAccount);
+ function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)
+ internal
+ returns (bytes[] memory outputs)
+ {
+ Operation memory operation = intent.operations[index];
+ TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));
+ _validateTransferOperation(transferOperation, proposal.datas[index]);
+
+ bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);
+ for (uint256 i = 0; i < transferOperation.transfers.length; i++) {
+ TransferData memory transfer = transferOperation.transfers[i];
+ _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);
}
- _emitIntentEvents(intent, proposal, new bytes(0));
- _payFees(intent, proposal, isSmartAccount);
+ outputs = new bytes[](0);
+ _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));
}
/**
- * @dev Validates and executes a proposal to fulfill a call intent
- * @param intent Call intent to be fulfilled
+ * @dev Validates and executes a proposal to fulfill a call operation
+ * @param intent Intent that contains call operation to be fulfilled
* @param proposal Call proposal to be executed
+ * @param index Position where the call proposal data and operation are located
*/
- function _executeCall(Intent memory intent, Proposal memory proposal) internal {
- CallIntent memory callIntent = abi.decode(intent.data, (CallIntent));
- _validateCallIntent(callIntent, proposal, intent.user);
+ function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)
+ internal
+ returns (bytes[] memory outputs)
+ {
+ Operation memory operation = intent.operations[index];
+ CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));
+ _validateCallOperation(callOperation, proposal.datas[index], operation.user);
+
+ outputs = new bytes[](callOperation.calls.length);
+ for (uint256 i = 0; i < callOperation.calls.length; i++) {
+ CallData memory call = callOperation.calls[i];
+ // solhint-disable-next-line avoid-low-level-calls
+ outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);
+ }
+
+ _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));
+ }
- bytes[] memory outputs = new bytes[](callIntent.calls.length);
- for (uint256 i = 0; i < callIntent.calls.length; i++) {
- CallData memory call = callIntent.calls[i];
+ /**
+ * @dev Validates and executes a proposal to fulfill a dynamic call operation
+ * @param intent Intent that contains dynamic call operation to be fulfilled
+ * @param proposal Dynamic call proposal to be executed
+ * @param index Position where the dynamic call proposal data and operation are located
+ * @param variables List of operations outputs
+ */
+ function _executeDynamicCall(
+ Intent memory intent,
+ Proposal memory proposal,
+ uint256 index,
+ bytes[][] memory variables
+ ) internal returns (bytes[] memory outputs) {
+ Operation memory operation = intent.operations[index];
+ DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));
+ _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);
+
+ outputs = new bytes[](dynamicCallOperation.calls.length);
+ for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {
+ DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));
+ bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);
// solhint-disable-next-line avoid-low-level-calls
- outputs[i] = smartAccountsHandler.call(intent.user, call.target, call.data, call.value);
+ outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);
}
- _emitIntentEvents(intent, proposal, abi.encode(outputs));
- _payFees(intent, proposal, true);
+ _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));
}
/**
* @dev Validates an intent and its corresponding proposal
+ The off-chain validators are assuring that:
+ - The trigger signer has authorization over the intent.feePayer and each operations[i].user
* @param intent Intent to be fulfilled
* @param proposal Proposal to be executed
* @param signature Proposal signature
@@ -289,11 +396,18 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
{
if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);
if (intent.nonce == bytes32(0)) revert SettlerNonceZero();
- if (getNonceBlock[intent.user][intent.nonce] != 0) revert SettlerNonceAlreadyUsed(intent.user, intent.nonce);
+ bytes32 intentHash = intent.hash();
+ if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);
- if (intentsValidator != address(0)) {
- bytes memory safeguard = _userSafeguard[intent.user];
- if (safeguard.length > 0) IIntentsValidator(intentsValidator).validate(intent, safeguard);
+ if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();
+ if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();
+
+ if (operationsValidator != address(0)) {
+ for (uint256 i = 0; i < intent.operations.length; i++) {
+ Operation memory operation = intent.operations[i];
+ bytes memory safeguard = _userSafeguard[operation.user];
+ if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);
+ }
}
bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);
@@ -318,7 +432,7 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
}
address lastValidator = address(0);
- Validation memory validation = Validation(intent.hash());
+ Validation memory validation = Validation(intentHash);
bytes32 typedDataHash = _hashTypedDataV4(validation.hash());
for (uint256 i = 0; i < intent.validations.length; i++) {
address validator = ECDSA.recover(typedDataHash, intent.validations[i]);
@@ -336,18 +450,15 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
}
/**
- * @dev Validates a swap intent and its corresponding proposal
- * @param intent Swap intent to be fulfilled
+ * @dev Validates a swap operation and its corresponding proposal
+ * @param operation Swap operation to be fulfilled
* @param proposal Proposal to be executed
*/
- function _validateSwapIntent(SwapIntent memory intent, SwapProposal memory proposal) internal view {
- bool isChainInvalid = intent.sourceChain != block.chainid && intent.destinationChain != block.chainid;
- if (isChainInvalid) revert SettlerInvalidChain(block.chainid);
+ function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {
+ if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();
- if (proposal.amountsOut.length != intent.tokensOut.length) revert SettlerInvalidProposedAmounts();
-
- for (uint256 i = 0; i < intent.tokensOut.length; i++) {
- TokenOut memory tokenOut = intent.tokensOut[i];
+ for (uint256 i = 0; i < operation.tokensOut.length; i++) {
+ TokenOut memory tokenOut = operation.tokensOut[i];
address recipient = tokenOut.recipient;
if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);
@@ -355,93 +466,155 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
uint256 proposedAmount = proposal.amountsOut[i];
if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);
}
-
- if (intent.sourceChain != intent.destinationChain) {
- bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);
- if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);
- }
}
/**
- * @dev Validates a transfer intent and its corresponding proposal
- * @param intent Transfer intent to be fulfilled
+ * @dev Validates a single-chain swap operation and its corresponding proposal
+ * @param operation Swap operation to be fulfilled
* @param proposal Proposal to be executed
*/
- function _validateTransferIntent(TransferIntent memory intent, Proposal memory proposal) internal view {
- if (intent.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);
- if (proposal.data.length > 0) revert SettlerProposalDataNotEmpty();
- for (uint256 i = 0; i < intent.transfers.length; i++) {
- address recipient = intent.transfers[i].recipient;
+ function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)
+ internal
+ view
+ {
+ if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();
+ if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);
+ _validateSwapOperation(operation, proposal);
+ }
+
+ /**
+ * @dev Validates a transfer operation and its corresponding proposal
+ * @param operation Transfer operation to be fulfilled
+ * @param proposalData data of the proposal
+ */
+ function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {
+ if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);
+ if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();
+ for (uint256 i = 0; i < operation.transfers.length; i++) {
+ address recipient = operation.transfers[i].recipient;
if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);
}
}
/**
- * @dev Validates a call intent and its corresponding proposal
- * @param intent Call intent to be fulfilled
- * @param proposal Proposal to be executed
- * @param user The originator of the intent
+ * @dev Validates a call operation and its corresponding proposal
+ * @param operation Call operation to be fulfilled
+ * @param proposalData data of the proposal
+ * @param user The originator of the operation
+ */
+ function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)
+ internal
+ view
+ {
+ if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);
+ if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();
+ if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);
+ }
+
+ /**
+ * @dev Validates a dynamic call operation and its corresponding proposal
+ * @param operation Dynamic call operation to be fulfilled
+ * @param proposalData data of the proposal
+ * @param user The originator of the operation
*/
- function _validateCallIntent(CallIntent memory intent, Proposal memory proposal, address user) internal view {
- if (intent.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);
- if (proposal.data.length > 0) revert SettlerProposalDataNotEmpty();
+ function _validateDynamicCallOperation(
+ DynamicCallOperation memory operation,
+ bytes memory proposalData,
+ address user
+ ) internal view {
+ if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);
+ if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();
if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);
}
/**
- * @dev Tells the contract balance for each token out of a swap intent
- * @param intent Swap intent containing the list of tokens out
+ * @dev Validates a cross-chain swap operation and its corresponding proposal
+ * @param operation Swap operation to be fulfilled
+ * @param proposal Proposal to be executed
*/
- function _getTokensOutBalance(SwapIntent memory intent) internal view returns (uint256[] memory balances) {
- balances = new uint256[](intent.tokensOut.length);
- if (intent.destinationChain == block.chainid) {
- for (uint256 i = 0; i < intent.tokensOut.length; i++) {
- balances[i] = ERC20Helpers.balanceOf(intent.tokensOut[i].token, address(this));
+ function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)
+ internal
+ view
+ {
+ if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();
+ bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;
+ if (isChainInvalid) revert SettlerInvalidChain(block.chainid);
+ _validateSwapOperation(operation, proposal);
+ bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);
+ if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);
+ }
+
+ /**
+ * @dev Tells the contract balance for each token out of a swap operation
+ * @param operation Swap operation containing the list of tokens out
+ */
+ function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {
+ balances = new uint256[](operation.tokensOut.length);
+ if (operation.destinationChain == block.chainid) {
+ for (uint256 i = 0; i < operation.tokensOut.length; i++) {
+ balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));
}
}
}
/**
* @dev Tells if the intent and proposal deadlines should be validated
+ In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored
* @param intent Intent to be fulfilled
*/
function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {
- if (intent.op != uint8(OpType.Swap)) return true;
- SwapIntent memory swapIntent = abi.decode(intent.data, (SwapIntent));
- if (swapIntent.sourceChain == swapIntent.destinationChain) return true;
+ // Cross-chain operation can only be the first (and only) operation
+ Operation memory operation = intent.operations[0];
+ if (operation.opType != uint8(OpType.CrossChainSwap)) return true;
+ SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));
return swapIntent.sourceChain == block.chainid;
}
/**
- * @dev Emits intent custom events
- * @param intent Intent to emit the custom events for
- * @param proposal Proposal that fulfills the intent
+ * @dev Emits operation custom events
+ * @param operation Operation to emit the custom events for
+ * @param proposal Proposal that fulfills the operation
+ * @param intentHash Hash of the intent the operation belongs to
+ * @param index Position of the operation on operations
* @param output Encoded array of outputs
*/
- function _emitIntentEvents(Intent memory intent, Proposal memory proposal, bytes memory output) internal {
- for (uint256 i = 0; i < intent.events.length; i++) {
- IntentEvent memory intentEvent = intent.events[i];
- emit IntentExecuted(
- intent.user,
- intentEvent.topic,
- uint8(intent.op),
- intent,
+ function _emitOperationEvents(
+ Operation memory operation,
+ Proposal memory proposal,
+ bytes32 intentHash,
+ uint256 index,
+ bytes memory output
+ ) internal {
+ for (uint256 i = 0; i < operation.events.length; i++) {
+ OperationEvent memory operationEvent = operation.events[i];
+ emit OperationExecuted(
+ operation.user,
+ operationEvent.topic,
+ uint8(operation.opType),
+ operation,
proposal,
+ intentHash,
+ index,
output,
- intentEvent.data
+ operationEvent.data
);
}
}
/**
- * @dev Pays fees
+ * @dev Pays fees from the intent feePayer
* @param intent Intent to be fulfilled
* @param proposal Proposal to be executed
- * @param isSmartAccount Whether the intent user is a smart account
*/
- function _payFees(Intent memory intent, Proposal memory proposal, bool isSmartAccount) internal {
- address from = intent.user;
+ function _payFees(Intent memory intent, Proposal memory proposal) internal {
+ // A CrossChainSwap only pays fees on destination chain and must be the only operation
+ if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {
+ SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));
+ if (swapOperation.sourceChain == block.chainid) return;
+ }
+ address from = intent.feePayer;
address to = _msgSender();
+ bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);
for (uint256 i = 0; i < intent.maxFees.length; i++) {
address token = intent.maxFees[i].token;
if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);
@@ -475,12 +648,22 @@ contract Settler is ISettler, Ownable, ReentrancyGuard, EIP712 {
}
/**
- * @dev Sets the intents validator
- * @param newIntentsValidator New intents validator to be set
+ * @dev Sets the operations validator
+ * @param newOperationsValidator New operations validator to be set
+ */
+ function _setOperationsValidator(address newOperationsValidator) internal {
+ operationsValidator = newOperationsValidator;
+ emit OperationsValidatorSet(newOperationsValidator);
+ }
+
+ /**
+ * @dev Sets the dynamic call encoder
+ * @param newDynamicCallEncoder New dynamic call encoder to be set
*/
- function _setIntentsValidator(address newIntentsValidator) internal {
- intentsValidator = newIntentsValidator;
- emit IntentsValidatorSet(newIntentsValidator);
+ function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {
+ if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();
+ dynamicCallEncoder = newDynamicCallEncoder;
+ emit DynamicCallEncoderSet(newDynamicCallEncoder);
}
/**
diff --git a/packages/evm/contracts/dynamic-calls/DynamicCallEncoder.sol b/packages/evm/contracts/dynamic-calls/DynamicCallEncoder.sol
new file mode 100644
index 0000000..4a63610
--- /dev/null
+++ b/packages/evm/contracts/dynamic-calls/DynamicCallEncoder.sol
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.20;
+
+import './DynamicCallTypes.sol';
+import '../interfaces/IDynamicCallEncoder.sol';
+import '../utils/BytesHelpers.sol';
+
+/**
+ * @title DynamicCallEncoder
+ * @dev Builds calldata for arbitrary contract calls from structured arguments.
+ *
+ * This encoder supports:
+ * - Literal ABI-encoded arguments
+ * - Variable references resolved from previous execution results
+ *
+ * The encoder follows standard ABI encoding rules, reconstructing
+ * the calldata heads and tails dynamically based on argument types.
+ */
+contract DynamicCallEncoder is IDynamicCallEncoder {
+ using BytesHelpers for bytes;
+
+ /**
+ * @dev Internal representation of a fully-encoded argument
+ * @param data ABI-encoded argument payload
+ * @param isDynamic Whether this argument requires a head offset
+ */
+ struct EncodedArg {
+ bytes data;
+ bool isDynamic;
+ }
+
+ /**
+ * @dev Encodes a dynamic call into calldata
+ * @param dynamicCall Dynamic call specification
+ * @param variables List of resolved variable values
+ * @param variablesLength Number of resolved variables
+ * @return data Fully ABI-encoded calldata
+ */
+ function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)
+ external
+ pure
+ override
+ returns (bytes memory data)
+ {
+ if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();
+ data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);
+ }
+
+ /**
+ * @dev Builds calldata from a selector and a list of dynamic arguments
+ * This function performs standard ABI aggregation:
+ * - static arguments are inlined in the head
+ * - dynamic arguments place offsets in the head and append data to the tail
+ */
+ function _buildCalldata(
+ bytes4 selector,
+ DynamicArg[] memory args,
+ bytes[][] memory variables,
+ uint256 variablesLength
+ ) internal pure returns (bytes memory data) {
+ uint256 n = args.length;
+ bytes[] memory encodedArgs = new bytes[](n);
+ bool[] memory isDynamic = new bool[](n);
+ uint256 headLength = 0;
+
+ for (uint256 i = 0; i < n; i++) {
+ EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);
+ encodedArgs[i] = enc.data;
+ isDynamic[i] = enc.isDynamic;
+ headLength += enc.isDynamic ? 32 : enc.data.length;
+ }
+
+ bytes memory heads;
+ bytes memory tails;
+ uint256 nextDynamicHead = headLength;
+
+ for (uint256 i = 0; i < n; i++) {
+ if (isDynamic[i]) {
+ heads = bytes.concat(heads, bytes32(nextDynamicHead));
+ tails = bytes.concat(tails, encodedArgs[i]);
+ nextDynamicHead += encodedArgs[i].length;
+ } else {
+ heads = bytes.concat(heads, encodedArgs[i]);
+ }
+ }
+
+ data = bytes.concat(selector, heads, tails);
+ }
+
+ /**
+ * @dev Encodes a single dynamic argument based on its kind
+ */
+ function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)
+ internal
+ pure
+ returns (EncodedArg memory out)
+ {
+ if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg);
+ if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg, variables, variablesLength);
+ revert DynamicCallEncoderInvalidArgKind();
+ }
+
+ /**
+ * @dev Encodes a literal argument
+ */
+ function _encodeLiteral(DynamicArg memory arg) internal pure returns (EncodedArg memory) {
+ return _encodeAbiValue(arg.data, arg.isDynamic);
+ }
+
+ /**
+ * @dev Encodes a variable argument by resolving it from the variables list
+ */
+ function _encodeVariable(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)
+ internal
+ pure
+ returns (EncodedArg memory)
+ {
+ if (arg.data.length != 64) revert DynamicCallEncoderVariableRefBadLength();
+ uint256 opIndex = arg.data.readWord0();
+ uint256 subIndex = arg.data.readWord1();
+ if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();
+ if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();
+
+ return _encodeAbiValue(variables[opIndex][subIndex], arg.isDynamic);
+ }
+
+ /**
+ * @dev Interprets ABI-like bytes as either a static or dynamic value. Used for variable resolution.
+ */
+ function _encodeAbiValue(bytes memory data, bool isDynamic) internal pure returns (EncodedArg memory out) {
+ if (data.length == 0 || data.length % 32 != 0) revert DynamicCallEncoderBadLength();
+
+ if (isDynamic) {
+ if (data.length < 64) revert DynamicCallEncoderEmptyDynamic();
+ if (data.readWord0() != 0x20) revert DynamicCallEncoderBadLength();
+
+ out.data = data.sliceFrom(32);
+ out.isDynamic = true;
+ } else {
+ out.data = data;
+ out.isDynamic = false;
+ }
+ }
+}
diff --git a/packages/evm/contracts/dynamic-calls/DynamicCallTypes.sol b/packages/evm/contracts/dynamic-calls/DynamicCallTypes.sol
new file mode 100644
index 0000000..eaaae1c
--- /dev/null
+++ b/packages/evm/contracts/dynamic-calls/DynamicCallTypes.sol
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.20;
+
+/**
+ * @dev Kind of dynamic argument to be encoded
+ * @param Literal ABI-encoded literal value provided by the resolver
+ * @param Variable Reference to a previously resolved variable value
+ */
+enum DynamicArgKind {
+ Literal,
+ Variable
+}
+
+/**
+ * @dev Represents a single dynamic argument
+ * @param kind Type of argument resolution strategy
+ * @param data Encoded argument data, interpreted based on `kind`
+ * @param isDynamic Whether the resolved argument is ABI-dynamic
+ */
+struct DynamicArg {
+ DynamicArgKind kind;
+ bytes data;
+ bool isDynamic;
+}
+
+/**
+ * @dev Represents a dynamic contract call intent
+ * @param target Contract address to be called
+ * @param value ETH value to be sent with the call
+ * @param selector Function selector to invoke
+ * @param arguments List of dynamically resolved arguments
+ */
+struct DynamicCall {
+ address target;
+ uint256 value;
+ bytes4 selector;
+ DynamicArg[] arguments;
+}
diff --git a/packages/evm/contracts/interfaces/IDynamicCallEncoder.sol b/packages/evm/contracts/interfaces/IDynamicCallEncoder.sol
new file mode 100644
index 0000000..de2e7f9
--- /dev/null
+++ b/packages/evm/contracts/interfaces/IDynamicCallEncoder.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.20;
+
+import '../dynamic-calls/DynamicCallTypes.sol';
+
+interface IDynamicCallEncoder {
+ /**
+ * @dev The argument is not word-aligned
+ */
+ error DynamicCallEncoderBadLength();
+
+ /**
+ * @dev The dynamic value resolves to empty data
+ */
+ error DynamicCallEncoderEmptyDynamic();
+
+ /**
+ * @dev The variable reference is not exactly one word
+ */
+ error DynamicCallEncoderVariableRefBadLength();
+
+ /**
+ * @dev The variable index is outside the variables array
+ */
+ error DynamicCallEncoderVariableOutOfBounds();
+
+ /**
+ * @dev The declared variables length exceeds the variables array length
+ */
+ error DynamicCallEncoderVariablesLengthOutOfBounds();
+
+ /**
+ * @dev The argument kind is not valid
+ */
+ error DynamicCallEncoderInvalidArgKind();
+
+ /**
+ * @dev Encodes a dynamic call into calldata.
+ * @param dynamicCall Dynamic call specification.
+ * @param variables List of resolved variable values.
+ * @param variablesLength Number of resolved variables.
+ */
+ function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)
+ external
+ pure
+ returns (bytes memory);
+}
diff --git a/packages/evm/contracts/interfaces/IExecutor.sol b/packages/evm/contracts/interfaces/IExecutor.sol
index 5577f5d..31cd8b1 100644
--- a/packages/evm/contracts/interfaces/IExecutor.sol
+++ b/packages/evm/contracts/interfaces/IExecutor.sol
@@ -9,9 +9,10 @@ import '../Intents.sol';
*/
interface IExecutor {
/**
- * @dev Executes an intent proposal
- * @param intent Intent to be executed
- * @param proposal Proposal to be executed to fulfill the intent
+ * @dev Executes an operation proposal
+ * @param operation Operation to be executed
+ * @param operationHash unique hash of the operation
+ * @param proposalData data of the proposal to be executed to fulfill the operation
*/
- function execute(Intent memory intent, Proposal memory proposal) external;
+ function execute(Operation memory operation, bytes32 operationHash, bytes memory proposalData) external;
}
diff --git a/packages/evm/contracts/interfaces/IIntentsValidator.sol b/packages/evm/contracts/interfaces/IIntentsValidator.sol
deleted file mode 100644
index 6135490..0000000
--- a/packages/evm/contracts/interfaces/IIntentsValidator.sol
+++ /dev/null
@@ -1,19 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-pragma solidity ^0.8.20;
-
-import '../Intents.sol';
-import '../safeguards/Safeguards.sol';
-
-/**
- * @title IntentsValidator
- * @dev Performs intents validations based on safeguards
- */
-interface IIntentsValidator {
- /**
- * @dev Validates an intent for a safeguard
- * @param intent Intent to be validated
- * @param config Safeguard config to validate the intent with
- */
- function validate(Intent memory intent, bytes memory config) external pure;
-}
diff --git a/packages/evm/contracts/interfaces/IOperationsValidator.sol b/packages/evm/contracts/interfaces/IOperationsValidator.sol
new file mode 100644
index 0000000..1730e04
--- /dev/null
+++ b/packages/evm/contracts/interfaces/IOperationsValidator.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+import '../Intents.sol';
+import '../safeguards/Safeguards.sol';
+
+/**
+ * @title OperationsValidator
+ * @dev Performs operations validations based on safeguards
+ */
+interface IOperationsValidator {
+ /**
+ * @dev Validates an operation for a safeguard
+ * @param operation Operation to be validated
+ * @param config Safeguard config to validate the operation with
+ */
+ function validate(Operation memory operation, bytes memory config) external pure;
+}
diff --git a/packages/evm/contracts/interfaces/ISettler.sol b/packages/evm/contracts/interfaces/ISettler.sol
index d52dcef..80d1ff5 100644
--- a/packages/evm/contracts/interfaces/ISettler.sol
+++ b/packages/evm/contracts/interfaces/ISettler.sol
@@ -10,9 +10,9 @@ import '../safeguards/Safeguards.sol';
*/
interface ISettler {
/**
- * @dev The requested intent type is unknown
+ * @dev The requested operation type is unknown
*/
- error SettlerUnknownIntentType(uint8 op);
+ error SettlerUnknownOperationType(uint8 opType);
/**
* @dev The simulation has been successful
@@ -55,9 +55,9 @@ interface ISettler {
error SettlerNonceZero();
/**
- * @dev The nonce has already been used for the user
+ * @dev The intent has already been executed
*/
- error SettlerNonceAlreadyUsed(address user, bytes32 nonce);
+ error SettlerIntentAlreadyExecuted(bytes32 hash);
/**
* @dev The intent deadline is in the past
@@ -104,6 +104,16 @@ interface ISettler {
*/
error SettlerSolverFeeInvalidLength();
+ /**
+ * @dev The intent operations array is empty
+ */
+ error SettlerIntentOperationsEmpty();
+
+ /**
+ * @dev The proposal datas length does not match the intent operations length
+ */
+ error SettlerProposalDataInvalidLength();
+
/**
* @dev The solver fee is too high
*/
@@ -134,20 +144,37 @@ interface ISettler {
*/
error SettlerTooManySafeguards(uint256 lengthRequested);
+ /**
+ * @dev The chains of a swap operation do not match the swap type (single or cross chain)
+ */
+ error SettlerOperationChainsMismatch();
+
+ /**
+ * @dev A CrossChainSwap operation must be the only operation in the intent
+ */
+ error SettlerCrossChainSwapMustBeOnlyOperation();
+
/**
* @dev The new smart accounts handler is zero
*/
error SmartAccountsHandlerZero();
/**
- * @dev Custom events emitted for each intent
+ * @dev The new dynamic call encoder is zero
*/
- event IntentExecuted(
+ error SettlerDynamicCallEncoderZero();
+
+ /**
+ * @dev Custom events emitted for each operation
+ */
+ event OperationExecuted(
address indexed user,
bytes32 indexed topic,
- uint8 indexed op,
- Intent intent,
+ uint8 indexed opType,
+ Operation operation,
Proposal proposal,
+ bytes32 intentHash,
+ uint256 index,
bytes output,
bytes data
);
@@ -155,7 +182,7 @@ interface ISettler {
/**
* @dev Emitted every time an intent is fulfilled
*/
- event ProposalExecuted(bytes32 indexed proposal, uint256 index);
+ event ProposalExecuted(bytes32 indexed proposal);
/**
* @dev Emitted every time tokens are withdrawn from the contract balance
@@ -168,9 +195,14 @@ interface ISettler {
event SmartAccountsHandlerSet(address indexed smartAccountsHandler);
/**
- * @dev Emitted every time the intents validator is set
+ * @dev Emitted every time the operations validator is set
+ */
+ event OperationsValidatorSet(address indexed operationsValidator);
+
+ /**
+ * @dev Emitted every time the dynamic call encoder is set
*/
- event IntentsValidatorSet(address indexed intentsValidator);
+ event DynamicCallEncoderSet(address indexed dynamicCallEncoder);
/**
* @dev Emitted every time a safeguard is set
@@ -188,16 +220,20 @@ interface ISettler {
function smartAccountsHandler() external view returns (address);
/**
- * @dev Tells the reference to the intents validator
+ * @dev Tells the reference to the operations validator
*/
- function intentsValidator() external view returns (address);
+ function operationsValidator() external view returns (address);
/**
- * @dev Tells the block at which a user nonce was used. Returns 0 if unused.
- * @param user Address of the user being queried
- * @param nonce Nonce being queried
+ * @dev Tells the reference to the dynamic call encoder
*/
- function getNonceBlock(address user, bytes32 nonce) external view returns (uint256);
+ function dynamicCallEncoder() external view returns (address);
+
+ /**
+ * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.
+ * @param hash Hash of the intent being queried
+ */
+ function getIntentBlock(bytes32 hash) external view returns (uint256);
/**
* @dev Tells the safeguard set for a user
@@ -237,10 +273,16 @@ interface ISettler {
function setSmartAccountsHandler(address newSmartAccountsHandler) external;
/**
- * @dev Sets a new intents validator address
- * @param newIntentsValidator New intents validator to be set
+ * @dev Sets a new operations validator address
+ * @param newOperationsValidator New operations validator to be set
+ */
+ function setOperationsValidator(address newOperationsValidator) external;
+
+ /**
+ * @dev Sets a new dynamic call encoder address
+ * @param newDynamicCallEncoder New dynamic call encoder to be set
*/
- function setIntentsValidator(address newIntentsValidator) external;
+ function setDynamicCallEncoder(address newDynamicCallEncoder) external;
/**
* @dev Sets a safeguard for a user
@@ -250,14 +292,18 @@ interface ISettler {
/**
* @dev Executes a proposal to fulfill an intent
- * @param executions List of executions, each including the intent, proposal, and proposal signature
+ * @param intent Intent to be fulfilled
+ * @param proposal Proposal to be executed
+ * @param signature Proposal signature
*/
- function execute(Execution[] memory executions) external;
+ function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;
/**
* @dev Simulates an execution. It will always revert. Successful executions are returned as
* `SettlerSimulationSuccess` errors. Any other error should be treated as failure.
- * @param executions List of executions, each including the intent, proposal, and proposal signature
+ * @param intent Intent to be fulfilled
+ * @param proposal Proposal to be executed
+ * @param signature Proposal signature
*/
- function simulate(Execution[] memory executions) external;
+ function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;
}
diff --git a/packages/evm/contracts/proxy/Proxy.sol b/packages/evm/contracts/proxy/Proxy.sol
new file mode 100644
index 0000000..7652c70
--- /dev/null
+++ b/packages/evm/contracts/proxy/Proxy.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.20;
+
+import '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';
+
+contract Proxy is TransparentUpgradeableProxy {
+ constructor(address implementation, address initialOwner, bytes memory data)
+ TransparentUpgradeableProxy(implementation, initialOwner, data)
+ {}
+}
diff --git a/packages/evm/contracts/safeguards/BaseIntentsValidator.sol b/packages/evm/contracts/safeguards/BaseOperationsValidator.sol
similarity index 86%
rename from packages/evm/contracts/safeguards/BaseIntentsValidator.sol
rename to packages/evm/contracts/safeguards/BaseOperationsValidator.sol
index 6dca5f7..1011f9a 100644
--- a/packages/evm/contracts/safeguards/BaseIntentsValidator.sol
+++ b/packages/evm/contracts/safeguards/BaseOperationsValidator.sol
@@ -6,23 +6,23 @@ import './Safeguards.sol';
import '../Intents.sol';
/**
- * @title BaseIntentsValidator
+ * @title BaseOperationsValidator
*/
-contract BaseIntentsValidator {
+contract BaseOperationsValidator {
/**
- * @dev No intents allowed
+ * @dev No operations allowed
*/
- error IntentsValidatorNoneAllowed();
+ error OperationsValidatorNoneAllowed();
/**
- * @dev Intent type unknown
+ * @dev Operation type unknown
*/
- error IntentsValidatorUnknownIntentType(uint8 opType);
+ error OperationsValidatorUnknownOperationType(uint8 opType);
/**
* @dev Invalid safeguard mode
*/
- error IntentsValidatorInvalidSafeguardMode(uint8 mode);
+ error OperationsValidatorInvalidSafeguardMode(uint8 mode);
/**
* @dev Tells whether a chain is allowed
diff --git a/packages/evm/contracts/safeguards/CallIntentsValidator.sol b/packages/evm/contracts/safeguards/CallOperationsValidator.sol
similarity index 59%
rename from packages/evm/contracts/safeguards/CallIntentsValidator.sol
rename to packages/evm/contracts/safeguards/CallOperationsValidator.sol
index fd8cf16..8fbfc5f 100644
--- a/packages/evm/contracts/safeguards/CallIntentsValidator.sol
+++ b/packages/evm/contracts/safeguards/CallOperationsValidator.sol
@@ -3,11 +3,11 @@
pragma solidity ^0.8.20;
import './Safeguards.sol';
-import './BaseIntentsValidator.sol';
+import './BaseOperationsValidator.sol';
import '../Intents.sol';
/**
- * @dev Call safeguard modes to validate call intents
+ * @dev Call safeguard modes to validate call operations
* @param None To ensure no calls are allowed
* @param Chain To validate that the chain where calls execute is allowed
* @param Target To validate that the call targets (contract addresses) are allowed
@@ -21,24 +21,28 @@ enum CallSafeguardMode {
}
/**
- * @title CallIntentsValidator
- * @dev Performs call intents validations based on safeguards
+ * @title CallOperationsValidator
+ * @dev Performs call operations validations based on safeguards
*/
-contract CallIntentsValidator is BaseIntentsValidator {
+contract CallOperationsValidator is BaseOperationsValidator {
/**
- * @dev Tells whether a call intent is valid for a safeguard
- * @param intent Call intent to be validated
- * @param safeguard Safeguard to validate the intent with
+ * @dev Tells whether a call operation is valid for a safeguard
+ * @param operation Call operation to be validated
+ * @param safeguard Safeguard to validate the operation with
*/
- function _isCallIntentValid(Intent memory intent, Safeguard memory safeguard) internal pure returns (bool) {
- CallIntent memory callIntent = abi.decode(intent.data, (CallIntent));
+ function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)
+ internal
+ pure
+ returns (bool)
+ {
+ CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));
if (safeguard.mode == uint8(CallSafeguardMode.Chain))
- return _isChainAllowed(callIntent.chainId, safeguard.config);
+ return _isChainAllowed(callOperation.chainId, safeguard.config);
if (safeguard.mode == uint8(CallSafeguardMode.Target))
- return _areCallTargetsValid(callIntent.calls, safeguard.config);
+ return _areCallTargetsValid(callOperation.calls, safeguard.config);
if (safeguard.mode == uint8(CallSafeguardMode.Selector))
- return _areCallSelectorsValid(callIntent.calls, safeguard.config);
- revert IntentsValidatorInvalidSafeguardMode(safeguard.mode);
+ return _areCallSelectorsValid(callOperation.calls, safeguard.config);
+ revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);
}
/**
diff --git a/packages/evm/contracts/safeguards/DynamicCallOperationsValidator.sol b/packages/evm/contracts/safeguards/DynamicCallOperationsValidator.sol
new file mode 100644
index 0000000..470002b
--- /dev/null
+++ b/packages/evm/contracts/safeguards/DynamicCallOperationsValidator.sol
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+import './CallOperationsValidator.sol';
+import './Safeguards.sol';
+import './BaseOperationsValidator.sol';
+import '../Intents.sol';
+import '../dynamic-calls/DynamicCallTypes.sol';
+
+/**
+ * @title DynamicCallOperationsValidator
+ * @dev Performs dynamic call operations validations based on call safeguards
+ */
+contract DynamicCallOperationsValidator is BaseOperationsValidator {
+ /**
+ * @dev Tells whether a dynamic call operation is valid for a safeguard
+ * @param operation Dynamic call operation to be validated
+ * @param safeguard Safeguard to validate the operation with
+ */
+ function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)
+ internal
+ pure
+ returns (bool)
+ {
+ DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));
+ if (safeguard.mode == uint8(CallSafeguardMode.Chain))
+ return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);
+ if (safeguard.mode == uint8(CallSafeguardMode.Target))
+ return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);
+ if (safeguard.mode == uint8(CallSafeguardMode.Selector))
+ return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);
+ revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);
+ }
+
+ /**
+ * @dev Tells whether the dynamic call targets are allowed
+ */
+ function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {
+ for (uint256 i = 0; i < calls.length; i++) {
+ DynamicCall memory call = abi.decode(calls[i], (DynamicCall));
+ if (!_isAccountAllowed(call.target, config)) return false;
+ }
+ return true;
+ }
+
+ /**
+ * @dev Tells whether the dynamic call selectors are allowed
+ */
+ function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {
+ for (uint256 i = 0; i < calls.length; i++) {
+ DynamicCall memory call = abi.decode(calls[i], (DynamicCall));
+ if (!_isSelectorAllowed(call.selector, config)) return false;
+ }
+ return true;
+ }
+}
diff --git a/packages/evm/contracts/safeguards/IntentsValidator.sol b/packages/evm/contracts/safeguards/IntentsValidator.sol
deleted file mode 100644
index fccc6d4..0000000
--- a/packages/evm/contracts/safeguards/IntentsValidator.sol
+++ /dev/null
@@ -1,146 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-pragma solidity ^0.8.20;
-
-import './CallIntentsValidator.sol';
-import './TransferIntentsValidator.sol';
-import './Safeguards.sol';
-import './SwapIntentsValidator.sol';
-import '../Intents.sol';
-import '../interfaces/IIntentsValidator.sol';
-
-/**
- * @title IntentsValidator
- * @dev Performs intents validations based on safeguards
- */
-contract IntentsValidator is IIntentsValidator, SwapIntentsValidator, TransferIntentsValidator, CallIntentsValidator {
- /**
- * @dev Safeguard validation failed
- */
- error IntentsValidatorSafeguardFailed();
-
- /**
- * @dev Invalid safeguard config mode
- */
- error IntentsValidatorInvalidSafeguardConfigMode(uint8 mode);
-
- /**
- * @dev Invalid safeguard group logic mode
- */
- error IntentsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);
-
- /**
- * @dev Tells whether an intent is valid for a safeguard
- * @param intent Intent to be validated
- * @param config Safeguard config to validate the intent with
- */
- function validate(Intent memory intent, bytes memory config) external pure override {
- (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));
- if (mode == uint8(SafeguardConfigMode.List)) _validate(intent, abi.decode(safeguard, (Safeguard[])));
- else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(intent, _decodeSafeguardTree(safeguard));
- else revert IntentsValidatorInvalidSafeguardConfigMode(mode);
- }
-
- /**
- * @dev Tells whether an intent is valid for a safeguards list
- * @param intent Intent to be validated
- * @param safeguards Safeguard list to validate the intent with
- */
- function _validate(Intent memory intent, Safeguard[] memory safeguards) internal pure {
- if (safeguards.length == 0) revert IntentsValidatorSafeguardFailed();
- for (uint256 i = 0; i < safeguards.length; i++) {
- if (!_isSafeguardValid(intent, safeguards[i])) revert IntentsValidatorSafeguardFailed();
- }
- }
-
- /**
- * @dev Tells whether an intent is valid for a safeguard tree
- * @param intent Intent to be validated
- * @param tree Safeguard tree to validate the intent with
- */
- function _validate(Intent memory intent, SafeguardTree memory tree) internal pure {
- if (tree.nodes.length == 0) revert IntentsValidatorSafeguardFailed();
- if (!_isSafeguardGroupValid(intent, tree, 0)) revert IntentsValidatorSafeguardFailed();
- }
-
- /**
- * @dev Tells whether an intent is valid for a safeguard tree at a certain level
- * @param intent Intent to be validated
- * @param tree Safeguard tree to validate the intent with
- * @param index Index of the group node to evaluate
- */
- function _isSafeguardGroupValid(Intent memory intent, SafeguardTree memory tree, uint16 index)
- internal
- pure
- returns (bool)
- {
- SafeguardGroup memory group = tree.nodes[index];
-
- if (group.logic == uint8(SafeguardGroupLogic.NOT)) {
- for (uint256 i = 0; i < group.leaves.length; i++) {
- if (_isSafeguardValid(intent, tree.leaves[group.leaves[i]])) return false;
- }
- for (uint256 i = 0; i < group.children.length; i++) {
- if (_isSafeguardGroupValid(intent, tree, group.children[i])) return false;
- }
- return true;
- }
-
- if (group.logic == uint8(SafeguardGroupLogic.AND)) {
- for (uint256 i = 0; i < group.leaves.length; i++) {
- if (!_isSafeguardValid(intent, tree.leaves[group.leaves[i]])) return false;
- }
- for (uint256 i = 0; i < group.children.length; i++) {
- if (!_isSafeguardGroupValid(intent, tree, group.children[i])) return false;
- }
- return true;
- }
-
- if (group.logic == uint8(SafeguardGroupLogic.OR)) {
- for (uint256 i = 0; i < group.leaves.length; i++) {
- if (_isSafeguardValid(intent, tree.leaves[group.leaves[i]])) return true;
- }
- for (uint256 i = 0; i < group.children.length; i++) {
- if (_isSafeguardGroupValid(intent, tree, group.children[i])) return true;
- }
- return false;
- }
-
- if (group.logic == uint8(SafeguardGroupLogic.XOR)) {
- uint256 hits = 0;
- for (uint256 i = 0; i < group.leaves.length; i++) {
- if (_isSafeguardValid(intent, tree.leaves[group.leaves[i]]))
- if (++hits > 1) return false;
- }
- for (uint256 i = 0; i < group.children.length; i++) {
- if (_isSafeguardGroupValid(intent, tree, group.children[i]))
- if (++hits > 1) return false;
- }
- return hits == 1;
- }
-
- revert IntentsValidatorInvalidSafeguardGroupLogicMode(group.logic);
- }
-
- /**
- * @dev Tells whether an intent is valid for a safeguard
- * @param intent Intent to be validated
- * @param safeguard Safeguard to validate the intent with
- */
- function _isSafeguardValid(Intent memory intent, Safeguard memory safeguard) internal pure returns (bool) {
- if (safeguard.mode == uint8(0)) revert IntentsValidatorNoneAllowed();
- if (intent.op == uint8(OpType.Swap)) return _isSwapIntentValid(intent, safeguard);
- if (intent.op == uint8(OpType.Transfer)) return _isTransferIntentValid(intent, safeguard);
- if (intent.op == uint8(OpType.Call)) return _isCallIntentValid(intent, safeguard);
- revert IntentsValidatorUnknownIntentType(uint8(intent.op));
- }
-
- /**
- * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays
- * @param data Safeguard tree data to be decoded
- */
- function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {
- (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));
- return SafeguardTree(nodes, leaves);
- }
-}
diff --git a/packages/evm/contracts/safeguards/OperationsValidator.sol b/packages/evm/contracts/safeguards/OperationsValidator.sol
new file mode 100644
index 0000000..6b379ac
--- /dev/null
+++ b/packages/evm/contracts/safeguards/OperationsValidator.sol
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+import './CallOperationsValidator.sol';
+import './DynamicCallOperationsValidator.sol';
+import './TransferOperationsValidator.sol';
+import './Safeguards.sol';
+import './SwapOperationsValidator.sol';
+import '../Intents.sol';
+import '../interfaces/IOperationsValidator.sol';
+
+/**
+ * @title OperationsValidator
+ * @dev Performs operations validations based on safeguards
+ */
+contract OperationsValidator is
+ IOperationsValidator,
+ SwapOperationsValidator,
+ TransferOperationsValidator,
+ CallOperationsValidator,
+ DynamicCallOperationsValidator
+{
+ /**
+ * @dev Safeguard validation failed
+ */
+ error OperationsValidatorSafeguardFailed();
+
+ /**
+ * @dev Invalid safeguard config mode
+ */
+ error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);
+
+ /**
+ * @dev Invalid safeguard group logic mode
+ */
+ error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);
+
+ /**
+ * @dev Tells whether an operation is valid for a safeguard
+ * @param operation Operation to be validated
+ * @param config Safeguard config to validate the operation with
+ */
+ function validate(Operation memory operation, bytes memory config) external pure override {
+ (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));
+ if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));
+ else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));
+ else revert OperationsValidatorInvalidSafeguardConfigMode(mode);
+ }
+
+ /**
+ * @dev Tells whether an operation is valid for a safeguards list
+ * @param operation Operation to be validated
+ * @param safeguards Safeguard list to validate the operation with
+ */
+ function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {
+ if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();
+ for (uint256 i = 0; i < safeguards.length; i++) {
+ if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();
+ }
+ }
+
+ /**
+ * @dev Tells whether an operation is valid for a safeguard tree
+ * @param operation Operation to be validated
+ * @param tree Safeguard tree to validate the operation with
+ */
+ function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {
+ if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();
+ if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();
+ }
+
+ /**
+ * @dev Tells whether an operation is valid for a safeguard tree at a certain level
+ * @param operation Operation to be validated
+ * @param tree Safeguard tree to validate the operation with
+ * @param index Index of the group node to evaluate
+ */
+ function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)
+ internal
+ pure
+ returns (bool)
+ {
+ SafeguardGroup memory group = tree.nodes[index];
+
+ if (group.logic == uint8(SafeguardGroupLogic.NOT)) {
+ for (uint256 i = 0; i < group.leaves.length; i++) {
+ if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;
+ }
+ for (uint256 i = 0; i < group.children.length; i++) {
+ if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;
+ }
+ return true;
+ }
+
+ if (group.logic == uint8(SafeguardGroupLogic.AND)) {
+ for (uint256 i = 0; i < group.leaves.length; i++) {
+ if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;
+ }
+ for (uint256 i = 0; i < group.children.length; i++) {
+ if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;
+ }
+ return true;
+ }
+
+ if (group.logic == uint8(SafeguardGroupLogic.OR)) {
+ for (uint256 i = 0; i < group.leaves.length; i++) {
+ if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;
+ }
+ for (uint256 i = 0; i < group.children.length; i++) {
+ if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;
+ }
+ return false;
+ }
+
+ if (group.logic == uint8(SafeguardGroupLogic.XOR)) {
+ uint256 hits = 0;
+ for (uint256 i = 0; i < group.leaves.length; i++) {
+ if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))
+ if (++hits > 1) return false;
+ }
+ for (uint256 i = 0; i < group.children.length; i++) {
+ if (_isSafeguardGroupValid(operation, tree, group.children[i]))
+ if (++hits > 1) return false;
+ }
+ return hits == 1;
+ }
+
+ revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);
+ }
+
+ /**
+ * @dev Tells whether an operation is valid for a safeguard
+ * @param operation Operation to be validated
+ * @param safeguard Safeguard to validate the operation with
+ */
+ function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {
+ if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();
+ if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {
+ return _isSwapOperationValid(operation, safeguard);
+ }
+ if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);
+ if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);
+ if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);
+ revert OperationsValidatorUnknownOperationType(uint8(operation.opType));
+ }
+
+ /**
+ * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays
+ * @param data Safeguard tree data to be decoded
+ */
+ function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {
+ (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));
+ return SafeguardTree(nodes, leaves);
+ }
+}
diff --git a/packages/evm/contracts/safeguards/SwapIntentsValidator.sol b/packages/evm/contracts/safeguards/SwapOperationsValidator.sol
similarity index 65%
rename from packages/evm/contracts/safeguards/SwapIntentsValidator.sol
rename to packages/evm/contracts/safeguards/SwapOperationsValidator.sol
index 3b6aaf2..1104ecd 100644
--- a/packages/evm/contracts/safeguards/SwapIntentsValidator.sol
+++ b/packages/evm/contracts/safeguards/SwapOperationsValidator.sol
@@ -2,12 +2,12 @@
pragma solidity ^0.8.20;
-import './BaseIntentsValidator.sol';
+import './BaseOperationsValidator.sol';
import './Safeguards.sol';
import '../Intents.sol';
/**
- * @dev Swap safeguard modes to validate swap intents
+ * @dev Swap safeguard modes to validate swap operations
* @param None To ensure no swaps are allowed
* @param SourceChain To validate that the source chain is allowed
* @param DestinationChain To validate that the destination chain is allowed
@@ -25,28 +25,32 @@ enum SwapSafeguardMode {
}
/**
- * @title SwapIntentsValidator
- * @dev Performs swap intents validations based on safeguards
+ * @title SwapOperationsValidator
+ * @dev Performs swap operations validations based on safeguards
*/
-contract SwapIntentsValidator is BaseIntentsValidator {
+contract SwapOperationsValidator is BaseOperationsValidator {
/**
- * @dev Tells whether a swap intent is valid for a safeguard
- * @param intent Swap intent to be validated
- * @param safeguard Safeguard to validate the intent with
+ * @dev Tells whether a swap operation is valid for a safeguard
+ * @param operation Swap operation to be validated
+ * @param safeguard Safeguard to validate the operation with
*/
- function _isSwapIntentValid(Intent memory intent, Safeguard memory safeguard) internal pure returns (bool) {
- SwapIntent memory swapIntent = abi.decode(intent.data, (SwapIntent));
+ function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)
+ internal
+ pure
+ returns (bool)
+ {
+ SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));
if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))
- return _isChainAllowed(swapIntent.sourceChain, safeguard.config);
+ return _isChainAllowed(swapOperation.sourceChain, safeguard.config);
if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))
- return _isChainAllowed(swapIntent.destinationChain, safeguard.config);
+ return _isChainAllowed(swapOperation.destinationChain, safeguard.config);
if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))
- return _areSwapTokensInValid(swapIntent.tokensIn, safeguard.config);
+ return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);
if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))
- return _areSwapTokensOutValid(swapIntent.tokensOut, safeguard.config);
+ return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);
if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))
- return _areSwapRecipientsValid(swapIntent.tokensOut, safeguard.config);
- revert IntentsValidatorInvalidSafeguardMode(safeguard.mode);
+ return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);
+ revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);
}
/**
diff --git a/packages/evm/contracts/safeguards/TransferIntentsValidator.sol b/packages/evm/contracts/safeguards/TransferOperationsValidator.sol
similarity index 58%
rename from packages/evm/contracts/safeguards/TransferIntentsValidator.sol
rename to packages/evm/contracts/safeguards/TransferOperationsValidator.sol
index 28a0c26..335471c 100644
--- a/packages/evm/contracts/safeguards/TransferIntentsValidator.sol
+++ b/packages/evm/contracts/safeguards/TransferOperationsValidator.sol
@@ -2,12 +2,12 @@
pragma solidity ^0.8.20;
-import './BaseIntentsValidator.sol';
+import './BaseOperationsValidator.sol';
import './Safeguards.sol';
import '../Intents.sol';
/**
- * @dev Transfer safeguard modes to validate transfer intents
+ * @dev Transfer safeguard modes to validate transfer operations
* @param None To ensure no transfers are allowed
* @param Chain To validate that the chain where transfers execute is allowed
* @param Token To validate that the tokens being transferred are allowed
@@ -21,24 +21,28 @@ enum TransferSafeguardMode {
}
/**
- * @title TransferIntentsValidator
- * @dev Performs transfer intents validations based on safeguards
+ * @title TransferOperationsValidator
+ * @dev Performs transfer operations validations based on safeguards
*/
-contract TransferIntentsValidator is BaseIntentsValidator {
+contract TransferOperationsValidator is BaseOperationsValidator {
/**
- * @dev Tells whether a transfer intent is valid for a safeguard
- * @param intent Transfer intent to be validated
- * @param safeguard Safeguard to validate the intent with
+ * @dev Tells whether a transfer operation is valid for a safeguard
+ * @param operation Transfer operation to be validated
+ * @param safeguard Safeguard to validate the operation with
*/
- function _isTransferIntentValid(Intent memory intent, Safeguard memory safeguard) internal pure returns (bool) {
- TransferIntent memory transferIntent = abi.decode(intent.data, (TransferIntent));
+ function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)
+ internal
+ pure
+ returns (bool)
+ {
+ TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));
if (safeguard.mode == uint8(TransferSafeguardMode.Chain))
- return _isChainAllowed(transferIntent.chainId, safeguard.config);
+ return _isChainAllowed(transferOperation.chainId, safeguard.config);
if (safeguard.mode == uint8(TransferSafeguardMode.Token))
- return _areTransferTokensValid(transferIntent.transfers, safeguard.config);
+ return _areTransferTokensValid(transferOperation.transfers, safeguard.config);
if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))
- return _areTransferRecipientsValid(transferIntent.transfers, safeguard.config);
- revert IntentsValidatorInvalidSafeguardMode(safeguard.mode);
+ return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);
+ revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);
}
/**
diff --git a/packages/evm/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol b/packages/evm/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol
index 5e3a249..946e4eb 100644
--- a/packages/evm/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol
+++ b/packages/evm/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol
@@ -42,12 +42,15 @@ library SmartAccountsHandlerHelpers {
*/
function call(address handler, address account, address target, bytes memory data, uint256 value)
internal
- returns (bytes memory)
+ returns (bytes memory result)
{
- return
- Address.functionDelegateCall(
- handler,
- abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)
- );
+ result = Address.functionDelegateCall(
+ handler,
+ abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)
+ );
+ // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload
+ assembly {
+ result := add(result, 64)
+ }
}
}
diff --git a/packages/evm/contracts/test/SettlerV2Mock.sol b/packages/evm/contracts/test/SettlerV2Mock.sol
new file mode 100644
index 0000000..9f48710
--- /dev/null
+++ b/packages/evm/contracts/test/SettlerV2Mock.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.20;
+
+import '../Settler.sol';
+
+contract SettlerV2Mock is Settler {
+ function someNewFunction() external pure returns (string memory) {
+ return 'Some new function';
+ }
+}
diff --git a/packages/evm/contracts/test/dynamic-calls/StaticCallMock.sol b/packages/evm/contracts/test/dynamic-calls/StaticCallMock.sol
new file mode 100644
index 0000000..fad711e
--- /dev/null
+++ b/packages/evm/contracts/test/dynamic-calls/StaticCallMock.sol
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+contract StaticCallMock {
+ struct StructMock {
+ uint256 a;
+ address b;
+ }
+
+ function returnUint(uint256 value) external pure returns (uint256) {
+ return value;
+ }
+
+ function returnAddress(address value) external payable returns (address) {
+ return value;
+ }
+
+ function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {
+ return value;
+ }
+
+ function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {
+ return value;
+ }
+
+ function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {
+ return value;
+ }
+}
diff --git a/packages/evm/contracts/test/executors/EmptyExecutorMock.sol b/packages/evm/contracts/test/executors/EmptyExecutorMock.sol
index d9b4ebc..7a787c4 100644
--- a/packages/evm/contracts/test/executors/EmptyExecutorMock.sol
+++ b/packages/evm/contracts/test/executors/EmptyExecutorMock.sol
@@ -7,7 +7,7 @@ import '../../interfaces/IExecutor.sol';
contract EmptyExecutorMock is IExecutor {
event Executed();
- function execute(Intent memory, Proposal memory) external override {
+ function execute(Operation memory, bytes32, bytes memory) external override {
emit Executed();
}
}
diff --git a/packages/evm/contracts/test/executors/MintExecutorMock.sol b/packages/evm/contracts/test/executors/MintExecutorMock.sol
index eb72fbd..8f31717 100644
--- a/packages/evm/contracts/test/executors/MintExecutorMock.sol
+++ b/packages/evm/contracts/test/executors/MintExecutorMock.sol
@@ -10,10 +10,13 @@ import '../../interfaces/IExecutor.sol';
contract MintExecutorMock is IExecutor {
event Minted();
- function execute(Intent memory intent, Proposal memory proposal) external override {
- require(intent.op == uint8(OpType.Swap), 'Invalid intent type');
+ function execute(Operation memory operation, bytes32, bytes memory proposalData) external override {
+ require(
+ operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),
+ 'Invalid operation type'
+ );
- SwapProposal memory swapProposal = abi.decode(proposal.data, (SwapProposal));
+ SwapProposal memory swapProposal = abi.decode(proposalData, (SwapProposal));
(address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));
require(tokens.length == amounts.length, 'Invalid inputs');
diff --git a/packages/evm/contracts/test/executors/ReentrantExecutorMock.sol b/packages/evm/contracts/test/executors/ReentrantExecutorMock.sol
index 343bfc5..7eb7a03 100644
--- a/packages/evm/contracts/test/executors/ReentrantExecutorMock.sol
+++ b/packages/evm/contracts/test/executors/ReentrantExecutorMock.sol
@@ -13,7 +13,9 @@ contract ReentrantExecutorMock is IExecutor {
settler = _settler;
}
- function execute(Intent memory, Proposal memory) external override {
- ISettler(settler).execute(new Execution[](0));
+ function execute(Operation memory, bytes32, bytes memory) external override {
+ Intent memory intent;
+ Proposal memory proposal;
+ ISettler(settler).execute(intent, proposal, new bytes(0));
}
}
diff --git a/packages/evm/contracts/test/executors/TransferExecutorMock.sol b/packages/evm/contracts/test/executors/TransferExecutorMock.sol
index b67c75d..95cfdba 100644
--- a/packages/evm/contracts/test/executors/TransferExecutorMock.sol
+++ b/packages/evm/contracts/test/executors/TransferExecutorMock.sol
@@ -14,10 +14,13 @@ contract TransferExecutorMock is IExecutor {
// solhint-disable-previous-line no-empty-blocks
}
- function execute(Intent memory intent, Proposal memory proposal) external override {
- require(intent.op == uint8(OpType.Swap), 'Invalid intent type');
+ function execute(Operation memory operation, bytes32, bytes memory proposalData) external override {
+ require(
+ operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),
+ 'Invalid operation type'
+ );
- SwapProposal memory swapProposal = abi.decode(proposal.data, (SwapProposal));
+ SwapProposal memory swapProposal = abi.decode(proposalData, (SwapProposal));
(address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));
require(tokens.length == amounts.length, 'Invalid inputs');
diff --git a/packages/evm/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol b/packages/evm/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol
new file mode 100644
index 0000000..c351c79
--- /dev/null
+++ b/packages/evm/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.20;
+
+import '../../smart-accounts/SmartAccountsHandlerHelpers.sol';
+
+contract SmartAccountsHandlerHelpersMock {
+ using SmartAccountsHandlerHelpers for address;
+
+ function call(address handler, address account, address target, bytes memory data, uint256 value)
+ external
+ returns (bytes memory)
+ {
+ // solhint-disable-next-line avoid-low-level-calls
+ return handler.call(account, target, data, value);
+ }
+}
diff --git a/packages/evm/contracts/test/utils/BytesHelpersMock.sol b/packages/evm/contracts/test/utils/BytesHelpersMock.sol
new file mode 100644
index 0000000..cd8d453
--- /dev/null
+++ b/packages/evm/contracts/test/utils/BytesHelpersMock.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.24;
+
+import '../../utils/BytesHelpers.sol';
+
+contract BytesHelpersMock {
+ using BytesHelpers for bytes;
+
+ function readWord0(bytes memory data) external pure returns (uint256) {
+ return data.readWord0();
+ }
+
+ function readWord1(bytes memory data) external pure returns (uint256) {
+ return data.readWord1();
+ }
+
+ function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {
+ return data.slice(start, end);
+ }
+
+ function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {
+ return data.sliceFrom(start);
+ }
+}
diff --git a/packages/evm/contracts/utils/BytesHelpers.sol b/packages/evm/contracts/utils/BytesHelpers.sol
new file mode 100644
index 0000000..61bfd0f
--- /dev/null
+++ b/packages/evm/contracts/utils/BytesHelpers.sol
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+pragma solidity ^0.8.24;
+
+/**
+ * @title BytesHelpers
+ * @dev Collection of low-level helpers to operate on `bytes` values in memory.
+ */
+library BytesHelpers {
+ /**
+ * @dev Thrown when a slice operation exceeds the bounds of the input bytes
+ */
+ error BytesLibSliceOutOfBounds();
+
+ /**
+ * @dev Reads the first 32-byte word of a bytes array
+ * @param data Bytes array to read from
+ * @return result First ABI word of `data`
+ */
+ function readWord0(bytes memory data) internal pure returns (uint256) {
+ return readWord(data, 0);
+ }
+
+ /**
+ * @dev Reads the second 32-byte word of a bytes array
+ * @param data Bytes array to read from
+ * @return result Second ABI word of `data`
+ */
+ function readWord1(bytes memory data) internal pure returns (uint256) {
+ return readWord(data, 1);
+ }
+
+ /**
+ * @dev Reads the N-th 32-byte word of a bytes array
+ * @param data Bytes array to read from
+ * @param index Word index to read (0-based)
+ * @return result N-th ABI word of `data`
+ */
+ function readWord(bytes memory data, uint256 index) private pure returns (uint256 result) {
+ assembly {
+ result := mload(add(data, add(32, mul(index, 32))))
+ }
+ }
+
+ /**
+ * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)
+ * @param data Bytes array to slice
+ * @param start Starting byte index (inclusive)
+ * @param end Ending byte index (exclusive)
+ */
+ function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {
+ if (end < start) revert BytesLibSliceOutOfBounds();
+ if (end > data.length) revert BytesLibSliceOutOfBounds();
+
+ uint256 len = end - start;
+ out = new bytes(len);
+
+ assembly {
+ let src := add(add(data, 32), start)
+ let dst := add(out, 32)
+ mcopy(dst, src, len)
+ }
+ }
+
+ /**
+ * @dev Returns a slice of a bytes array starting at `start` until the end
+ * @param data Bytes array to slice
+ * @param start Starting byte index (inclusive)
+ */
+ function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {
+ return slice(data, start, data.length);
+ }
+}
diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts
index 91e4e82..2222a3a 100644
--- a/packages/evm/hardhat.config.ts
+++ b/packages/evm/hardhat.config.ts
@@ -8,6 +8,7 @@ dotenv.config()
const config: HardhatUserConfig = {
plugins: [hardhatVerify, hardhatToolboxMochaEthersPlugin],
solidity: {
+ dependenciesToCompile: ['@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol'],
profiles: {
default: {
version: '0.8.28',
@@ -87,6 +88,18 @@ const config: HardhatUserConfig = {
apiKey: process.env.ETHERSCAN_KEY || '',
},
},
+ chainDescriptors: {
+ 146: {
+ name: 'sonic',
+ blockExplorers: {
+ etherscan: {
+ name: 'SonicScan',
+ url: 'https://sonicscan.org/',
+ apiUrl: 'https://api.etherscan.io/v2/api',
+ },
+ },
+ },
+ },
}
export default config
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..1fbbc7b
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/167571dafa48e7ff636310c6c9f0fc8e202e44bc.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..4dea682
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -0,0 +1,233 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccount7702",
+ "sourceName": "contracts/smart-accounts/SmartAccount7702.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccount7702SenderNotSettler",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "name": "Called",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "call",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "settler",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15451": [
+ {
+ "length": 32,
+ "start": 155
+ },
+ {
+ "length": 32,
+ "start": 391
+ },
+ {
+ "length": 32,
+ "start": 485
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "167571dafa48e7ff636310c6c9f0fc8e202e44bc"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-1/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/build-info/167571dafa48e7ff636310c6c9f0fc8e202e44bc.json b/packages/evm/ignition/deployments/chain-1/build-info/167571dafa48e7ff636310c6c9f0fc8e202e44bc.json
new file mode 100644
index 0000000..dc33803
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-1/build-info/167571dafa48e7ff636310c6c9f0fc8e202e44bc.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "167571dafa48e7ff636310c6c9f0fc8e202e44bc",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload\n * @param isDynamic Whether this argument requires a head offset\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.isDynamic ? 32 : enc.data.length;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument\n */\n function _encodeLiteral(DynamicArg memory arg) internal pure returns (EncodedArg memory) {\n return _encodeAbiValue(arg.data, arg.isDynamic);\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory)\n {\n if (arg.data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = arg.data.readWord0();\n uint256 subIndex = arg.data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n\n return _encodeAbiValue(variables[opIndex][subIndex], arg.isDynamic);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value. Used for variable resolution.\n */\n function _encodeAbiValue(bytes memory data, bool isDynamic) internal pure returns (EncodedArg memory out) {\n if (data.length == 0 || data.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (isDynamic) {\n if (data.length < 64) revert DynamicCallEncoderEmptyDynamic();\n if (data.readWord0() != 0x20) revert DynamicCallEncoderBadLength();\n\n out.data = data.sliceFrom(32);\n out.isDynamic = true;\n } else {\n out.data = data;\n out.isDynamic = false;\n }\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n * @param isDynamic Whether the resolved argument is ABI-dynamic\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n bool isDynamic;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param operation Operation to be executed\n * @param operationHash unique hash of the operation\n * @param proposalData data of the proposal to be executed to fulfill the operation\n */\n function execute(Operation memory operation, bytes32 operationHash, bytes memory proposalData) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n // Using the intent hash as the unique operation hash because cross-chain swap has only one operation per intent and the single swap executor does not use it\n bytes32 operationHash = intent.hash();\n IExecutor(swapProposal.executor).execute(operation, operationHash, proposal.datas[index]);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Operation memory, bytes32, bytes memory) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Operation memory operation, bytes32, bytes memory proposalData) external override {\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposalData, (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Operation memory, bytes32, bytes memory) external override {\n Intent memory intent;\n Proposal memory proposal;\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Operation memory operation, bytes32, bytes memory proposalData) external override {\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposalData, (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.24;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.24;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256) {\n return readWord(data, 0);\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256) {\n return readWord(data, 1);\n }\n\n /**\n * @dev Reads the N-th 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @param index Word index to read (0-based)\n * @return result N-th ABI word of `data`\n */\n function readWord(bytes memory data, uint256 index) private pure returns (uint256 result) {\n assembly {\n result := mload(add(data, add(32, mul(index, 32))))\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n mcopy(dst, src, len)\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/deployed_addresses.json b/packages/evm/ignition/deployments/chain-1/deployed_addresses.json
index 74efce1..79cb856 100644
--- a/packages/evm/ignition/deployments/chain-1/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-1/deployed_addresses.json
@@ -2,9 +2,15 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
"Create3PaymentsReceiver#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e"
+ "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA",
+ "Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-1/journal.jsonl b/packages/evm/ignition/deployments/chain-1/journal.jsonl
index 5b5620c..fbda24e 100644
--- a/packages/evm/ignition/deployments/chain-1/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-1/journal.jsonl
@@ -57,4 +57,42 @@
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","hash":"0xabe28bdbbb937d5941e3d6a0a81abfd8c7b51b62a00b24eb413d3f1315240b82","networkInteractionId":1,"receipt":{"blockHash":"0x1f8e675c3e480a8bad9e8771e6c039abe92e5596a5163e531baeebe6e98162c8","blockNumber":24435663,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":641,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b3281ab55ddb6644b4e085efaa384288a3f65057","0xce432bfcbeb3637715ae91740e95a5a137a347da9e83a966cd47ee68823605f4"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x","logIndex":642,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":643,"topics":["0xdc86ea80c17dba36e8aac1a8a9461dcc3967506848bd50e2e48b90507867abb9","0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":644,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000088438f46b65a391225d88a445c5551c229bbf85e"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3PaymentsReceiver#ICreateX","dependencies":["Create3PaymentsReceiver#ICreateX.deployCreate3","Create3PaymentsReceiver#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x88438f46B65a391225d88A445C5551c229bbF85e","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xabe28bdbbb937d5941e3d6a0a81abfd8c7b51b62a00b24eb413d3f1315240b82","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":19,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":19,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"5239700568"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"10000"}},"hash":"0xb6b4cac861dabfbff930cb16df458d954e1dbfa6d85ebad4c1639b1066e3576d"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0xb6b4cac861dabfbff930cb16df458d954e1dbfa6d85ebad4c1639b1066e3576d","networkInteractionId":1,"receipt":{"blockHash":"0x1434a01745b73c09fe23cea4affcc770739eac9a1076e09d40bb09b848d8f76d","blockNumber":24993610,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":808,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":809,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xb6b4cac861dabfbff930cb16df458d954e1dbfa6d85ebad4c1639b1066e3576d","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":22,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":22,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2938493214"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"10000"}},"hash":"0x9cfc702e0e03b90141e2c44c27924ea36a25d51c315e1155e5e43a2c36171ad9"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x9cfc702e0e03b90141e2c44c27924ea36a25d51c315e1155e5e43a2c36171ad9","networkInteractionId":1,"receipt":{"blockHash":"0x25dc6d5e6434858297279c30fc3204b1fdb54dfbff50e9a912ae29db526a917a","blockNumber":24993822,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":435,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":436,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":437,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x9cfc702e0e03b90141e2c44c27924ea36a25d51c315e1155e5e43a2c36171ad9","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":23,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":23,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2885102840"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"10000"}},"hash":"0x14f089970a4e19d0a7e3037fcb13541341d64b8f53bd0d5a06b045eaf267fe35"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0x14f089970a4e19d0a7e3037fcb13541341d64b8f53bd0d5a06b045eaf267fe35","networkInteractionId":1,"receipt":{"blockHash":"0x60839a059153464bf30de0d663e2fa699e8cb54d5ee14d11be9e7e31682d3e80","blockNumber":24993828,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":500,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":501,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":502,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":503,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":504,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":505,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":506,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":507,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x14f089970a4e19d0a7e3037fcb13541341d64b8f53bd0d5a06b045eaf267fe35","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccount7702#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":24,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":24,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3086497036"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"10000"}},"hash":"0xa4b1cebb3953ef410237be02560e73d66c1b19aa60d9ccc8e1c369af639f7b09"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0xa4b1cebb3953ef410237be02560e73d66c1b19aa60d9ccc8e1c369af639f7b09","networkInteractionId":1,"receipt":{"blockHash":"0x7aaeb02d6e506fdd75ebb1a4dff95fa0ebf5937dd9f60144c2cc964b72362c3f","blockNumber":24993834,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":933,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":934,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xa4b1cebb3953ef410237be02560e73d66c1b19aa60d9ccc8e1c369af639f7b09","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..acd9fd2
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -0,0 +1,233 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccount7702",
+ "sourceName": "contracts/smart-accounts/SmartAccount7702.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccount7702SenderNotSettler",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "name": "Called",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "call",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "settler",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15636": [
+ {
+ "length": 32,
+ "start": 155
+ },
+ {
+ "length": 32,
+ "start": 391
+ },
+ {
+ "length": 32,
+ "start": 485
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-10/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-10/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/deployed_addresses.json b/packages/evm/ignition/deployments/chain-10/deployed_addresses.json
index 6ee2990..5bb6950 100644
--- a/packages/evm/ignition/deployments/chain-10/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-10/deployed_addresses.json
@@ -2,11 +2,15 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
"Create3PaymentsReceiver#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e"
+ "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-10/journal.jsonl b/packages/evm/ignition/deployments/chain-10/journal.jsonl
index 513c35c..2771199 100644
--- a/packages/evm/ignition/deployments/chain-10/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-10/journal.jsonl
@@ -70,4 +70,42 @@
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","hash":"0x6189f247f7c4dfa5afeae985631aedb8ddd6a47141ad4b6e8bfaca2d925446e9","networkInteractionId":1,"receipt":{"blockHash":"0x97146a2c0652aa3bb830ce5f59faf9719b854b8088e54180cacc645143fd2dc3","blockNumber":147619864,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":160,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b3281ab55ddb6644b4e085efaa384288a3f65057","0xce432bfcbeb3637715ae91740e95a5a137a347da9e83a966cd47ee68823605f4"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x","logIndex":161,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":162,"topics":["0xdc86ea80c17dba36e8aac1a8a9461dcc3967506848bd50e2e48b90507867abb9","0x0000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":163,"topics":["0xdc86ea80c17dba36e8aac1a8a9461dcc3967506848bd50e2e48b90507867abb9","0x000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":164,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000088438f46b65a391225d88a445c5551c229bbf85e"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3PaymentsReceiver#ICreateX","dependencies":["Create3PaymentsReceiver#ICreateX.deployCreate3","Create3PaymentsReceiver#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x88438f46B65a391225d88A445C5551c229bbF85e","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x6189f247f7c4dfa5afeae985631aedb8ddd6a47141ad4b6e8bfaca2d925446e9","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":87,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":87,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1000664"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x5bdd4f21a3fdd1289ce91e942959835ae47af27838fb33d249d2b7f66855a446"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x5bdd4f21a3fdd1289ce91e942959835ae47af27838fb33d249d2b7f66855a446","networkInteractionId":1,"receipt":{"blockHash":"0x4e1a3d621f345700c7ef3a2fc0485acf6694844b90fc8d26f1a45eeebd7e174c","blockNumber":150979807,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":79,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":80,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x5bdd4f21a3fdd1289ce91e942959835ae47af27838fb33d249d2b7f66855a446","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":88,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":88,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1000662"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x1e4ebb9022bb2df6071fea9138accf0db97b9cff51d2075605dcfae5b50a0dbc"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x1e4ebb9022bb2df6071fea9138accf0db97b9cff51d2075605dcfae5b50a0dbc","networkInteractionId":1,"receipt":{"blockHash":"0x03f4b47bcce8dd165082c62db5e7ac1f97ae512765e990aa752cdb2eb403d1dd","blockNumber":150979822,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":118,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":119,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":120,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x1e4ebb9022bb2df6071fea9138accf0db97b9cff51d2075605dcfae5b50a0dbc","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":89,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":89,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1000664"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xd891b908e63b223750abb9d7585da5f81502fac25e93f99de21aa155a4f0bc45"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xd891b908e63b223750abb9d7585da5f81502fac25e93f99de21aa155a4f0bc45","networkInteractionId":1,"receipt":{"blockHash":"0x88900de2447e1059d017176ea5b931256d4a6369b92e51a6f4e9f49038f681c3","blockNumber":150979837,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":74,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":75,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":76,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":77,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":78,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":79,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":80,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":81,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xd891b908e63b223750abb9d7585da5f81502fac25e93f99de21aa155a4f0bc45","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccount7702#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":90,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":90,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1000662"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xe4b54841e777f82b6d3898b8b73d3b087418da28f177c8b9bea9bd4fab51c932"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0xe4b54841e777f82b6d3898b8b73d3b087418da28f177c8b9bea9bd4fab51c932","networkInteractionId":1,"receipt":{"blockHash":"0x7725d690cb8b399396968573813cf9d49c97a60232daf8b265940e773187a9e8","blockNumber":150979852,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":91,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":92,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xe4b54841e777f82b6d3898b8b73d3b087418da28f177c8b9bea9bd4fab51c932","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..acd9fd2
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -0,0 +1,233 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccount7702",
+ "sourceName": "contracts/smart-accounts/SmartAccount7702.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccount7702SenderNotSettler",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "name": "Called",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "call",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "settler",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15636": [
+ {
+ "length": 32,
+ "start": 155
+ },
+ {
+ "length": 32,
+ "start": 391
+ },
+ {
+ "length": 32,
+ "start": 485
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-100/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-100/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/deployed_addresses.json b/packages/evm/ignition/deployments/chain-100/deployed_addresses.json
index ea1eca9..f6f9d5f 100644
--- a/packages/evm/ignition/deployments/chain-100/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-100/deployed_addresses.json
@@ -2,7 +2,13 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA",
+ "Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-100/journal.jsonl b/packages/evm/ignition/deployments/chain-100/journal.jsonl
index 66c7ab8..d2b26da 100644
--- a/packages/evm/ignition/deployments/chain-100/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-100/journal.jsonl
@@ -48,4 +48,42 @@
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x52c3c56359cfc170ea3aac9d79b4ec7856ab6f2f50802ec0f24678ba0a444678","networkInteractionId":1,"receipt":{"blockHash":"0xd5cf0133b9bb965f2ed75ce1149cc8d03f451dbe244125930fe8741c2f9369a6","blockNumber":44613373,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":139,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":140,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000005cf82cbed1110fc2f75b3413d53abac492931804"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3MimicHelper#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x5cf82cBED1110fc2f75B3413d53abac492931804","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x52c3c56359cfc170ea3aac9d79b4ec7856ab6f2f50802ec0f24678ba0a444678","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":31,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":31,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"404777"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"69"}},"hash":"0x718430e17476570a0bf4cdaf0eb7b51aaf8fe87fea973e7bce9002f0ed9bb082"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x718430e17476570a0bf4cdaf0eb7b51aaf8fe87fea973e7bce9002f0ed9bb082","networkInteractionId":1,"receipt":{"blockHash":"0xb1969607d4f40aa2873c067e760d01cf5b3a48cbbb07249f97de92525074b385","blockNumber":45935705,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":134,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":135,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x718430e17476570a0bf4cdaf0eb7b51aaf8fe87fea973e7bce9002f0ed9bb082","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":32,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":32,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"502107"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"69"}},"hash":"0xd88261597479cadbb484895d6bba77a8cf50665f2c2f522d0b746bbac1a811b6"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0xd88261597479cadbb484895d6bba77a8cf50665f2c2f522d0b746bbac1a811b6","networkInteractionId":1,"receipt":{"blockHash":"0x63b431080d0b17be3dafdcadfa37a07f5f5b1c5f03b9023cd90142fb83e4aa60","blockNumber":45935713,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":12,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":13,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":14,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xd88261597479cadbb484895d6bba77a8cf50665f2c2f522d0b746bbac1a811b6","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":33,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":33,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"505205"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"69"}},"hash":"0x8323e8e457bc138b339b564aa5c01c1d88d182b49c425344bed5f1144e2ee5b1"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0x8323e8e457bc138b339b564aa5c01c1d88d182b49c425344bed5f1144e2ee5b1","networkInteractionId":1,"receipt":{"blockHash":"0x2a72e3ab4aa4b94c5702d9308fb2bf9e639885856289a133187b934f79944c01","blockNumber":45935720,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":77,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":78,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":79,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":80,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":81,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":82,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":83,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":84,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x8323e8e457bc138b339b564aa5c01c1d88d182b49c425344bed5f1144e2ee5b1","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccount7702#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":34,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":34,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"480169"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"69"}},"hash":"0x0771445722b2120dd628fe9d8d125126c85769d9df2a269f33c789b26e2b4a9b"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x0771445722b2120dd628fe9d8d125126c85769d9df2a269f33c789b26e2b4a9b","networkInteractionId":1,"receipt":{"blockHash":"0x390a1cc1cf16c112cf12abdad6b4ab727c018c8274b176c372d263491d0e5ef3","blockNumber":45935729,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":29,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":30,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x0771445722b2120dd628fe9d8d125126c85769d9df2a269f33c789b26e2b4a9b","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.json
index 5470105..409b396 100644
--- a/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea26469706673582212200db906be536b260156e08aaae1b608756d6d95fc3149e3ceb8be0206ed2ee96164736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.json
index e674e08..acd9fd2 100644
--- a/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.json
+++ b/packages/evm/ignition/deployments/chain-137/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -208,12 +208,12 @@
"type": "function"
}
],
- "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {
- "13087": [
+ "15636": [
{
"length": 32,
"start": 155
@@ -229,5 +229,5 @@
]
},
"inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-137/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-137/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/deployed_addresses.json b/packages/evm/ignition/deployments/chain-137/deployed_addresses.json
index 64e7ac2..c18d8fb 100644
--- a/packages/evm/ignition/deployments/chain-137/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-137/deployed_addresses.json
@@ -2,9 +2,13 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-137/journal.jsonl b/packages/evm/ignition/deployments/chain-137/journal.jsonl
index 8b0bbbf..c6239cf 100644
--- a/packages/evm/ignition/deployments/chain-137/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-137/journal.jsonl
@@ -35,4 +35,44 @@
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x1a88759492dbfde3ffdad7c0b1f9061e8eeb6cdd3552803fa51ac4344d760285","networkInteractionId":1,"receipt":{"blockHash":"0x0848efcac9008de4d46dec46c2a2615fb593c26d108fb32b6c54cd9638c8e700","blockNumber":84031032,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3298,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3299,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000005cf82cbed1110fc2f75b3413d53abac492931804"]},{"address":"0x0000000000000000000000000000000000001010","data":"0x000000000000000000000000000000000000000000000000002e683cdeed99dd00000000000000000000000000000000000000000000000356d4b21051d687c100000000000000000000000000000000000000000012f42c9f126ad2edbaa13700000000000000000000000000000000000000000000000356a649d372e8ede400000000000000000000000000000000000000000012f42c9f40d30fcca83b14","logIndex":3300,"topics":["0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63","0x0000000000000000000000000000000000000000000000000000000000001010","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b","0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3MimicHelper#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x5cf82cBED1110fc2f75B3413d53abac492931804","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x1a88759492dbfde3ffdad7c0b1f9061e8eeb6cdd3552803fa51ac4344d760285","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":9,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":9,"transaction":{"fees":{"gasPrice":{"_kind":"bigint","value":"140452713144"}},"hash":"0xd7cb90eeaab4182e8b10b5e57920f785b611e89b49cc87e33530be187c68da3c"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0xd7cb90eeaab4182e8b10b5e57920f785b611e89b49cc87e33530be187c68da3c","networkInteractionId":1,"receipt":{"blockHash":"0x296133a006b33e6271857053aff422413262ba243b1c2f967ffc1ba85cded7d0","blockNumber":86219748,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2095,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2096,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x0000000000000000000000000000000000001010","data":"0x000000000000000000000000000000000000000000000000006d461e57002a7c000000000000000000000000000000000000000000000000951c0d46d72a5d0b0000000000000000000000000000000000000000000931fba1aefe9d21f5dee300000000000000000000000000000000000000000000000094aec728802a328f0000000000000000000000000000000000000000000931fba21c44bb78f6095f","logIndex":2097,"topics":["0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63","0x0000000000000000000000000000000000000000000000000000000000001010","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b","0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xd7cb90eeaab4182e8b10b5e57920f785b611e89b49cc87e33530be187c68da3c","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"transaction":{"fees":{"gasPrice":{"_kind":"bigint","value":"126830508950"}},"hash":"0xc7ac9ea1a2642a70307ffa657610ab1fb7e4774a03bf9f882c4211d733996269"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0xc7ac9ea1a2642a70307ffa657610ab1fb7e4774a03bf9f882c4211d733996269","networkInteractionId":1,"receipt":{"blockHash":"0xbb6c1a6648b81d45fa41b7e923a3b7e477db75c6314d225f3fe82c149e52620a","blockNumber":86219781,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2488,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":2489,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2490,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x0000000000000000000000000000000000001010","data":"0x00000000000000000000000000000000000000000000000001cd1318247f0b9f000000000000000000000000000000000000000000000000936540c7dd77f6d30000000000000000000000000000000000000000000932084697ae7429ddb1d400000000000000000000000000000000000000000000000091982dafb8f8eb340000000000000000000000000000000000000000000932084864c18c4e5cbd73","logIndex":2491,"topics":["0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63","0x0000000000000000000000000000000000000000000000000000000000001010","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b","0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xc7ac9ea1a2642a70307ffa657610ab1fb7e4774a03bf9f882c4211d733996269","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"transaction":{"fees":{"gasPrice":{"_kind":"bigint","value":"126864767929"}},"hash":"0x7691356a90f7fd268aa55b1d9297e0a910b253acfc5507bcfeff68d8b14aaca0"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0x7691356a90f7fd268aa55b1d9297e0a910b253acfc5507bcfeff68d8b14aaca0","networkInteractionId":1,"receipt":{"blockHash":"0xcd13138e70dde4803c25c0049fa9a919646442b5c27e3f7ce96911b5abda0ea8","blockNumber":86219801,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3144,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":3145,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":3146,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":3147,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":3148,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":3149,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":3150,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3151,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]},{"address":"0x0000000000000000000000000000000000001010","data":"0x000000000000000000000000000000000000000000000000008d791d81340c390000000000000000000000000000000000000000000000008a02643e68542de900000000000000000000000000000000000000000009321035a75cf0a7ba9fbf0000000000000000000000000000000000000000000000008974eb20e72021b00000000000000000000000000000000000000000000932103634d60e28eeabf8","logIndex":3152,"topics":["0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63","0x0000000000000000000000000000000000000000000000000000000000001010","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b","0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x7691356a90f7fd268aa55b1d9297e0a910b253acfc5507bcfeff68d8b14aaca0","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3SmartAccount7702#SmartAccount7702","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"transaction":{"fees":{"gasPrice":{"_kind":"bigint","value":"136038744263"}},"hash":"0x93079296586533c8e0776b689543a829e09f233bd4db9bc5b2c11acf151f5937"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x93079296586533c8e0776b689543a829e09f233bd4db9bc5b2c11acf151f5937","networkInteractionId":1,"receipt":{"blockHash":"0x21c8648c03b4f93543f7e5f768f023bc6a7b9cfe4c7bddd8864acf18fd31c68e","blockNumber":86219870,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1988,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1989,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]},{"address":"0x0000000000000000000000000000000000001010","data":"0x00000000000000000000000000000000000000000000000000431070d8d56c9300000000000000000000000000000000000000000000000087620f52e100dc6a0000000000000000000000000000000000000000000932efd1935f7fbc34f56d000000000000000000000000000000000000000000000000871efee2082b6fd70000000000000000000000000000000000000000000932efd1d66ff0950a6200","logIndex":1990,"topics":["0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63","0x0000000000000000000000000000000000000000000000000000000000001010","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b","0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x93079296586533c8e0776b689543a829e09f233bd4db9bc5b2c11acf151f5937","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..acd9fd2
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -0,0 +1,233 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccount7702",
+ "sourceName": "contracts/smart-accounts/SmartAccount7702.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccount7702SenderNotSettler",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "name": "Called",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "call",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "settler",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15636": [
+ {
+ "length": 32,
+ "start": 155
+ },
+ {
+ "length": 32,
+ "start": 391
+ },
+ {
+ "length": 32,
+ "start": 485
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-146/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-146/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/deployed_addresses.json b/packages/evm/ignition/deployments/chain-146/deployed_addresses.json
index ea1eca9..f6f9d5f 100644
--- a/packages/evm/ignition/deployments/chain-146/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-146/deployed_addresses.json
@@ -2,7 +2,13 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA",
+ "Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-146/journal.jsonl b/packages/evm/ignition/deployments/chain-146/journal.jsonl
index ab2046a..180faea 100644
--- a/packages/evm/ignition/deployments/chain-146/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-146/journal.jsonl
@@ -48,4 +48,42 @@
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0xcea642818aa93a7847bc581f2a711d4fac4ef9ad2b570d28f60de2aaf1a788be","networkInteractionId":1,"receipt":{"blockHash":"0xc2c005aa8655ade78e29ce0bd163aff4b633df58858bf0a30640b33d0e4a12d6","blockNumber":62517582,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000005cf82cbed1110fc2f75b3413d53abac492931804"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3MimicHelper#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x5cf82cBED1110fc2f75B3413d53abac492931804","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xcea642818aa93a7847bc581f2a711d4fac4ef9ad2b570d28f60de2aaf1a788be","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":14,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":14,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"100000000001"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1"}},"hash":"0x9e5f990949ecff1fb50de88a9da9f3deae6170a62e24630cbf82ea25628e8a4f"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x9e5f990949ecff1fb50de88a9da9f3deae6170a62e24630cbf82ea25628e8a4f","networkInteractionId":1,"receipt":{"blockHash":"0x28f2e6cc3874d5ab8f7d30f87c192dceeada2154f87694cfb6a8bd30266d15d1","blockNumber":69231931,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":4,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x9e5f990949ecff1fb50de88a9da9f3deae6170a62e24630cbf82ea25628e8a4f","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":15,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":15,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"100000000001"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1"}},"hash":"0x7e354ee31b9526e4141b3fd3fd198f3b029ecbe60e8dc9642f07ddfa6da0685a"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x7e354ee31b9526e4141b3fd3fd198f3b029ecbe60e8dc9642f07ddfa6da0685a","networkInteractionId":1,"receipt":{"blockHash":"0x5a9e5738218f2731b4606cd1a11f84938c8d78456f658046e20bc9ed42269263","blockNumber":69234380,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":1,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x7e354ee31b9526e4141b3fd3fd198f3b029ecbe60e8dc9642f07ddfa6da0685a","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":16,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":16,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"100000000001"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1"}},"hash":"0xe9fa2d985a2b75e28d72a21945fff783ee740c8be66f8cf0316c081f5c02751f"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xe9fa2d985a2b75e28d72a21945fff783ee740c8be66f8cf0316c081f5c02751f","networkInteractionId":1,"receipt":{"blockHash":"0xd985ea648395bbe7a5ffe5f8c1c69a4b9c9286365cd30b085d8daf078679348d","blockNumber":69234413,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":1,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":2,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":3,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":4,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":5,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":6,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":7,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xe9fa2d985a2b75e28d72a21945fff783ee740c8be66f8cf0316c081f5c02751f","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccount7702#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":17,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":17,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"100000000001"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1"}},"hash":"0x707c61ec333beba844d0ee60583a87548307be7668178deb03a88aa3e117c10b"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x707c61ec333beba844d0ee60583a87548307be7668178deb03a88aa3e117c10b","networkInteractionId":1,"receipt":{"blockHash":"0x2c2fc058d0bf0875c4cf4272e0558021a885a56eb791843bbfc6f898bbf2f268","blockNumber":69234439,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x707c61ec333beba844d0ee60583a87548307be7668178deb03a88aa3e117c10b","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
index dec9a21..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/2ea009b03700817d235b9901c3ebe6048e01a993.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.json
index 9685932..acd9fd2 100644
--- a/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.json
+++ b/packages/evm/ignition/deployments/chain-42161/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -208,12 +208,12 @@
"type": "function"
}
],
- "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {
- "12700": [
+ "15636": [
{
"length": 32,
"start": 155
@@ -229,5 +229,5 @@
]
},
"inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
- "buildInfoId": "2ea009b03700817d235b9901c3ebe6048e01a993"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-42161/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-42161/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/deployed_addresses.json b/packages/evm/ignition/deployments/chain-42161/deployed_addresses.json
index 6ee2990..5bb6950 100644
--- a/packages/evm/ignition/deployments/chain-42161/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-42161/deployed_addresses.json
@@ -2,11 +2,15 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
"Create3PaymentsReceiver#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e"
+ "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-42161/journal.jsonl b/packages/evm/ignition/deployments/chain-42161/journal.jsonl
index d2e24e6..cbf4d9e 100644
--- a/packages/evm/ignition/deployments/chain-42161/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-42161/journal.jsonl
@@ -66,4 +66,44 @@
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","hash":"0x82e95812be34c55cd65841a752e09cae9ca7144f576b7808fd57169bb8727fd6","networkInteractionId":1,"receipt":{"blockHash":"0x5754fa0434231aa9a52d3cc7b22b675f2afe9facb24cc083cb305a91918461b0","blockNumber":431059196,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b3281ab55ddb6644b4e085efaa384288a3f65057","0xce432bfcbeb3637715ae91740e95a5a137a347da9e83a966cd47ee68823605f4"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":2,"topics":["0xdc86ea80c17dba36e8aac1a8a9461dcc3967506848bd50e2e48b90507867abb9","0x000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000088438f46b65a391225d88a445c5551c229bbf85e"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3PaymentsReceiver#ICreateX","dependencies":["Create3PaymentsReceiver#ICreateX.deployCreate3","Create3PaymentsReceiver#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x88438f46B65a391225d88A445C5551c229bbF85e","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x82e95812be34c55cd65841a752e09cae9ca7144f576b7808fd57169bb8727fd6","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":60,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":60,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"40668000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x53d2a9a64091ad7beb60f6314904838454b555f5fca19977eab5de4e491d76f1"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x53d2a9a64091ad7beb60f6314904838454b555f5fca19977eab5de4e491d76f1","networkInteractionId":1,"receipt":{"blockHash":"0x653fd5bb3ded9f3bb5df568f56adfaa40f4aba8106a47f3288d62e3babbc1d28","blockNumber":457946986,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x53d2a9a64091ad7beb60f6314904838454b555f5fca19977eab5de4e491d76f1","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":61,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":61,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"40000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xe452fa78868450855c5b91ffc83e3c9c6e2fd7152e0722bdb0aaea8121b2d644"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0xe452fa78868450855c5b91ffc83e3c9c6e2fd7152e0722bdb0aaea8121b2d644","networkInteractionId":1,"receipt":{"blockHash":"0x2d4f7c5423a576e54e45aa87f64696861ba77965478a35027a26b75ba68c2987","blockNumber":457947053,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":2,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":3,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xe452fa78868450855c5b91ffc83e3c9c6e2fd7152e0722bdb0aaea8121b2d644","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":62,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":62,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"40004000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xb402f377485d34267e71ef6e3ba7eacc566a4ef92a9085b52c228e692d59b55c"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xb402f377485d34267e71ef6e3ba7eacc566a4ef92a9085b52c228e692d59b55c","networkInteractionId":1,"receipt":{"blockHash":"0x913fe48f66bacd4e333d4e7cd6172974e5d7a4ef92f6a0999b4f613bb09fec62","blockNumber":457947116,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":2,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":3,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":4,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":5,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":6,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":7,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":8,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xb402f377485d34267e71ef6e3ba7eacc566a4ef92a9085b52c228e692d59b55c","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3SmartAccount7702#SmartAccount7702","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":63,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":63,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"40000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa960be3f59ecee185c65fdb07e53ee8832c7eec229c2f9222dab50fa4f2f2e2b"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0xa960be3f59ecee185c65fdb07e53ee8832c7eec229c2f9222dab50fa4f2f2e2b","networkInteractionId":1,"receipt":{"blockHash":"0x2ab5f383f12a08819e491f758a0f2cefa3ee471bcdf14a91ab5bdc15c37f7f4c","blockNumber":457948140,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xa960be3f59ecee185c65fdb07e53ee8832c7eec229c2f9222dab50fa4f2f2e2b","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.json
index 5470105..409b396 100644
--- a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea26469706673582212200db906be536b260156e08aaae1b608756d6d95fc3149e3ceb8be0206ed2ee96164736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.json
index e674e08..acd9fd2 100644
--- a/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.json
+++ b/packages/evm/ignition/deployments/chain-43114/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -208,12 +208,12 @@
"type": "function"
}
],
- "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {
- "13087": [
+ "15636": [
{
"length": 32,
"start": 155
@@ -229,5 +229,5 @@
]
},
"inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-43114/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-43114/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/deployed_addresses.json b/packages/evm/ignition/deployments/chain-43114/deployed_addresses.json
index 64e7ac2..c18d8fb 100644
--- a/packages/evm/ignition/deployments/chain-43114/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-43114/deployed_addresses.json
@@ -2,9 +2,13 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-43114/journal.jsonl b/packages/evm/ignition/deployments/chain-43114/journal.jsonl
index 19fd781..1da370f 100644
--- a/packages/evm/ignition/deployments/chain-43114/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-43114/journal.jsonl
@@ -35,4 +35,44 @@
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0xf4dd90ac4887c3b4c1f0f651e6fbfac49ee644831308696120fd8672ce99db4f","networkInteractionId":1,"receipt":{"blockHash":"0x52da0f6fd9d684b1eaf6a964dd134f16ef31a3cb5ff5f824c445232388932882","blockNumber":80077409,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":21,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":22,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000005cf82cbed1110fc2f75b3413d53abac492931804"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3MimicHelper#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x5cf82cBED1110fc2f75B3413d53abac492931804","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xf4dd90ac4887c3b4c1f0f651e6fbfac49ee644831308696120fd8672ce99db4f","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#SmartAccount7702","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":7,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":7,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3255320"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000"}},"hash":"0x91f8060c20f442d2fdc651767ce3492f7c3df8b72ecef8d34a24d31af1e632ad"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x91f8060c20f442d2fdc651767ce3492f7c3df8b72ecef8d34a24d31af1e632ad","networkInteractionId":1,"receipt":{"blockHash":"0x7b927b93b3ebf1f22588640164cb8beb99f10f3652902eaf551be8cd81b88997","blockNumber":84267322,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":24,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":25,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x91f8060c20f442d2fdc651767ce3492f7c3df8b72ecef8d34a24d31af1e632ad","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":8,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":8,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3624512"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000"}},"hash":"0xdae221b1559704f249aac7a10244c5940a2275b680046e6e996cd6a050ada594"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0xdae221b1559704f249aac7a10244c5940a2275b680046e6e996cd6a050ada594","networkInteractionId":1,"receipt":{"blockHash":"0xb820f6db938f57672a6ccbb187c7d7212d91e5bb3f7fac4a5a3f6f89c68d39a8","blockNumber":84267355,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":6,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":7,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":8,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xdae221b1559704f249aac7a10244c5940a2275b680046e6e996cd6a050ada594","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":9,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":9,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"4026246"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000"}},"hash":"0xea99ac422a76d084b09d80e1689f065b51dc2fa0413488143fc14ff13baad665"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xea99ac422a76d084b09d80e1689f065b51dc2fa0413488143fc14ff13baad665","networkInteractionId":1,"receipt":{"blockHash":"0x2e60fc0901842a2019aa04e1333d075463a9018814e4ec7914aa6e84cb3fbc24","blockNumber":84267397,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":40,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":41,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":42,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":43,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":44,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":45,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":46,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":47,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xea99ac422a76d084b09d80e1689f065b51dc2fa0413488143fc14ff13baad665","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"4250244"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000"}},"hash":"0x8f411f5dabcdd5375da80ed2efd32fc8de8a595d08e39a5fc10dc23f258fd707"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x8f411f5dabcdd5375da80ed2efd32fc8de8a595d08e39a5fc10dc23f258fd707","networkInteractionId":1,"receipt":{"blockHash":"0xa0c618353b99918956a80fc1e93a8a1b17c0622cf319196e9aa199e2d2e2a6f0","blockNumber":84267429,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":2,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x8f411f5dabcdd5375da80ed2efd32fc8de8a595d08e39a5fc10dc23f258fd707","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.json
index 5470105..409b396 100644
--- a/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea26469706673582212200db906be536b260156e08aaae1b608756d6d95fc3149e3ceb8be0206ed2ee96164736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea26469706673582212206cfc18c2dd62e00f8a662a44faae5c2af7e5663279f823372e5e626c8c42cdf864736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
index c563e44..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/c1330536164be24643c51488b01cb54b8abf1339.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.json
index e674e08..acd9fd2 100644
--- a/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.json
+++ b/packages/evm/ignition/deployments/chain-56/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -208,12 +208,12 @@
"type": "function"
}
],
- "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea2646970667358221220bdcc4e4360b81855f429fad386675f368258859399f6e8728091522ae456142564736f6c634300081c0033",
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {
- "13087": [
+ "15636": [
{
"length": 32,
"start": 155
@@ -229,5 +229,5 @@
]
},
"inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
- "buildInfoId": "c1330536164be24643c51488b01cb54b8abf1339"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-56/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-56/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/deployed_addresses.json b/packages/evm/ignition/deployments/chain-56/deployed_addresses.json
index 64e7ac2..c18d8fb 100644
--- a/packages/evm/ignition/deployments/chain-56/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-56/deployed_addresses.json
@@ -2,9 +2,13 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-56/journal.jsonl b/packages/evm/ignition/deployments/chain-56/journal.jsonl
index 8c832d8..91d2d03 100644
--- a/packages/evm/ignition/deployments/chain-56/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-56/journal.jsonl
@@ -35,4 +35,44 @@
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x13635243e9041c054defaedb8d75a09af97d44c5341f65123a958cf6bde6d239","networkInteractionId":1,"receipt":{"blockHash":"0x46d6c45a8d7143ef8199154e57537bcbee993ac9937bb0613aec9bb96d13b13f","blockNumber":85858461,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":143,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":144,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000005cf82cbed1110fc2f75b3413d53abac492931804"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3MimicHelper#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x5cf82cBED1110fc2f75B3413d53abac492931804","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x13635243e9041c054defaedb8d75a09af97d44c5341f65123a958cf6bde6d239","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x5cf82cBED1110fc2f75B3413d53abac492931804","contractName":"MimicHelper","dependencies":["Create3MimicHelper#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3MimicHelper#MimicHelper","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":10,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"50000000"}},"hash":"0x6932f51ff675aa7d1d5affcc6c05f031c355bdf079a36ce8337c6429867e124f"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x6932f51ff675aa7d1d5affcc6c05f031c355bdf079a36ce8337c6429867e124f","networkInteractionId":1,"receipt":{"blockHash":"0x6793f30cef25cec73f4259739bcc6b8a25083c1355a0e0f2daf1ccbf18c34fce","blockNumber":95571008,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":273,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":274,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x6932f51ff675aa7d1d5affcc6c05f031c355bdf079a36ce8337c6429867e124f","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"50000000"}},"hash":"0x6097de0ceca591dafae617f364efc7d15eb0c48ce4adb4fb0eb58658f542e308"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x6097de0ceca591dafae617f364efc7d15eb0c48ce4adb4fb0eb58658f542e308","networkInteractionId":1,"receipt":{"blockHash":"0x0d858b35254de18090085f2a464877809749e0236d57f7c41017d755da5eb3d6","blockNumber":95571055,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":208,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":209,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":210,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x6097de0ceca591dafae617f364efc7d15eb0c48ce4adb4fb0eb58658f542e308","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"50000000"}},"hash":"0xf2e08c54f817be87fa4c134402b04691d60aa1021cfd0f57c374c7e8fd4d018e"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xf2e08c54f817be87fa4c134402b04691d60aa1021cfd0f57c374c7e8fd4d018e","networkInteractionId":1,"receipt":{"blockHash":"0xe7332516a9f66d7984ac18cae98e0f69f465e1e73cb17e2e48c58dae30849c1a","blockNumber":95571110,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":470,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":471,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":472,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":473,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":474,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":475,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":476,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":477,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xf2e08c54f817be87fa4c134402b04691d60aa1021cfd0f57c374c7e8fd4d018e","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3SmartAccount7702#SmartAccount7702","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":13,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":13,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"50000000"}},"hash":"0x58abeff2ad97df82206ceeff2604b916057381674a03ab75be3348dea90ca693"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x58abeff2ad97df82206ceeff2604b916057381674a03ab75be3348dea90ca693","networkInteractionId":1,"receipt":{"blockHash":"0xfe84dc35194c5c0f3ef5c21464c3af07e4f06e1e2d52817a9f4dc0a0dead88b8","blockNumber":95571398,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":261,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":262,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x58abeff2ad97df82206ceeff2604b916057381674a03ab75be3348dea90ca693","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..514a8e4
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,132 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "DynamicCallEncoder",
+ "sourceName": "contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "BytesLibSliceOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticSize",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderBadStaticTrailer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderTooShortStatic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableTooShort",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariablesLengthOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "selector",
+ "type": "bytes4"
+ },
+ {
+ "components": [
+ {
+ "internalType": "enum DynamicArgKind",
+ "name": "kind",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct DynamicArg[]",
+ "name": "arguments",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct DynamicCall",
+ "name": "dynamicCall",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "variables",
+ "type": "bytes[][]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "variablesLength",
+ "type": "uint256"
+ }
+ ],
+ "name": "encode",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3DynamicCallEncoder#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..b6f5ffd
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Proxy#Proxy.json
@@ -0,0 +1,126 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "Proxy",
+ "sourceName": "contracts/proxy/Proxy.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "initialOwner",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "ERC1967InvalidImplementation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC1967NonPayable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ProxyDeniedAdminAccess",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "previousAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "implementation",
+ "type": "address"
+ }
+ ],
+ "name": "Upgraded",
+ "type": "event"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 16
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.dbg.json
index e872235..53274a9 100644
--- a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.json
index d6affec..409b396 100644
--- a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3Settler#Settler.json
@@ -4,18 +4,7 @@
"sourceName": "contracts/Settler.sol",
"abi": [
{
- "inputs": [
- {
- "internalType": "address",
- "name": "_controller",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "_owner",
- "type": "address"
- }
- ],
+ "inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
@@ -80,7 +69,12 @@
},
{
"inputs": [],
- "name": "InvalidShortString",
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
"type": "error"
},
{
@@ -142,6 +136,16 @@
"name": "SettlerAmountOutLtProposed",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerCrossChainSwapMustBeOnlyOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerDynamicCallEncoderZero",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -153,6 +157,22 @@
"name": "SettlerExecutorNotAllowed",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SettlerIntentAlreadyExecuted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SettlerIntentOperationsEmpty",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -224,24 +244,13 @@
"type": "error"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "user",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- }
- ],
- "name": "SettlerNonceAlreadyUsed",
+ "inputs": [],
+ "name": "SettlerNonceZero",
"type": "error"
},
{
"inputs": [],
- "name": "SettlerNonceZero",
+ "name": "SettlerOperationChainsMismatch",
"type": "error"
},
{
@@ -265,6 +274,11 @@
"name": "SettlerPostBalanceOutLtPre",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "SettlerProposalDataInvalidLength",
+ "type": "error"
+ },
{
"inputs": [],
"name": "SettlerProposalDataNotEmpty",
@@ -381,11 +395,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +446,17 @@
"type": "error"
},
{
+ "anonymous": false,
"inputs": [
{
- "internalType": "string",
- "name": "str",
- "type": "string"
+ "indexed": true,
+ "internalType": "address",
+ "name": "dynamicCallEncoder",
+ "type": "address"
}
],
- "name": "StringTooLong",
- "type": "error"
+ "name": "DynamicCallEncoderSet",
+ "type": "event"
},
{
"anonymous": false,
@@ -473,6 +489,19 @@
"name": "FundsRescued",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -491,14 +520,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +535,11 @@
"name": "user",
"type": "address"
},
- {
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
- },
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -556,29 +553,14 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
"indexed": false,
- "internalType": "struct Intent",
- "name": "intent",
+ "internalType": "struct Operation",
+ "name": "operation",
"type": "tuple"
},
{
@@ -589,9 +571,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +586,18 @@
"name": "proposal",
"type": "tuple"
},
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "intentHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ },
{
"indexed": false,
"internalType": "bytes",
@@ -617,7 +611,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +620,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +654,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +698,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,55 +758,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -819,61 +840,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "execute",
@@ -881,18 +887,32 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getIntentBlock",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -910,11 +930,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +947,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -963,6 +961,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -981,30 +1018,6 @@
"stateMutability": "pure",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- },
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "name": "getNonceBlock",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1015,9 +1028,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1044,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1064,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1081,9 @@
"name": "maxFees",
"type": "tuple[]"
},
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "topic",
- "type": "bytes32"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- }
- ],
- "internalType": "struct IntentEvent[]",
- "name": "events",
- "type": "tuple[]"
- },
{
"internalType": "bytes",
- "name": "configSig",
+ "name": "triggerSig",
"type": "bytes"
},
{
@@ -1109,6 +1095,45 @@
"internalType": "bytes[]",
"name": "validations",
"type": "bytes[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "topic",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct OperationEvent[]",
+ "name": "events",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
}
],
"internalType": "struct Intent",
@@ -1151,9 +1176,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_controller",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_dynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1259,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
+ "type": "address"
+ }
+ ],
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1250,55 +1311,75 @@
"inputs": [
{
"components": [
+ {
+ "internalType": "address",
+ "name": "feePayer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "nonce",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "token",
"type": "address"
},
{
- "internalType": "address",
- "name": "settler",
- "type": "address"
- },
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct MaxFee[]",
+ "name": "maxFees",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "triggerSig",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "minValidations",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validations",
+ "type": "bytes[]"
+ },
+ {
+ "components": [
{
- "internalType": "bytes32",
- "name": "nonce",
- "type": "bytes32"
+ "internalType": "uint8",
+ "name": "opType",
+ "type": "uint8"
},
{
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
- {
- "components": [
- {
- "internalType": "address",
- "name": "token",
- "type": "address"
- },
- {
- "internalType": "uint256",
- "name": "amount",
- "type": "uint256"
- }
- ],
- "internalType": "struct MaxFee[]",
- "name": "maxFees",
- "type": "tuple[]"
- },
{
"components": [
{
@@ -1312,61 +1393,46 @@
"type": "bytes"
}
],
- "internalType": "struct IntentEvent[]",
+ "internalType": "struct OperationEvent[]",
"name": "events",
"type": "tuple[]"
- },
- {
- "internalType": "bytes",
- "name": "configSig",
- "type": "bytes"
- },
- {
- "internalType": "uint256",
- "name": "minValidations",
- "type": "uint256"
- },
- {
- "internalType": "bytes[]",
- "name": "validations",
- "type": "bytes[]"
}
],
- "internalType": "struct Intent",
- "name": "intent",
- "type": "tuple"
+ "internalType": "struct Operation[]",
+ "name": "operations",
+ "type": "tuple[]"
+ }
+ ],
+ "internalType": "struct Intent",
+ "name": "intent",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
},
{
- "components": [
- {
- "internalType": "uint256",
- "name": "deadline",
- "type": "uint256"
- },
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
- {
- "internalType": "uint256[]",
- "name": "fees",
- "type": "uint256[]"
- }
- ],
- "internalType": "struct Proposal",
- "name": "proposal",
- "type": "tuple"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
- "internalType": "bytes",
- "name": "signature",
- "type": "bytes"
+ "internalType": "uint256[]",
+ "name": "fees",
+ "type": "uint256[]"
}
],
- "internalType": "struct Execution[]",
- "name": "executions",
- "type": "tuple[]"
+ "internalType": "struct Proposal",
+ "name": "proposal",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
}
],
"name": "simulate",
@@ -1405,84 +1471,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
- "immutableReferences": {
- "4041": [
- {
- "length": 32,
- "start": 10442
- }
- ],
- "4043": [
- {
- "length": 32,
- "start": 10400
- }
- ],
- "4045": [
- {
- "length": 32,
- "start": 10358
- }
- ],
- "4047": [
- {
- "length": 32,
- "start": 10523
- }
- ],
- "4049": [
- {
- "length": 32,
- "start": 10563
- }
- ],
- "4052": [
- {
- "length": 32,
- "start": 2980
- }
- ],
- "4055": [
- {
- "length": 32,
- "start": 3030
- }
- ],
- "8966": [
- {
- "length": 32,
- "start": 836
- },
- {
- "length": 32,
- "start": 1180
- },
- {
- "length": 32,
- "start": 1741
- },
- {
- "length": 32,
- "start": 4727
- },
- {
- "length": 32,
- "start": 5236
- },
- {
- "length": 32,
- "start": 5509
- },
- {
- "length": 32,
- "start": 8763
- }
- ]
- },
+ "immutableReferences": {},
"inputSourceName": "project/contracts/Settler.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..89f091c
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#ICreateX.json
@@ -0,0 +1,51 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "ICreateX",
+ "sourceName": "contracts/interfaces/ICreateX.sol",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "name": "ContractCreation",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "salt",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCode",
+ "type": "bytes"
+ }
+ ],
+ "name": "deployCreate3",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newContract",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x",
+ "deployedBytecode": "0x",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/interfaces/ICreateX.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..53274a9
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..acd9fd2
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/artifacts/Create3SmartAccount7702#SmartAccount7702.json
@@ -0,0 +1,233 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccount7702",
+ "sourceName": "contracts/smart-accounts/SmartAccount7702.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "AddressEmptyCode",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ }
+ ],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccount7702SenderNotSettler",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "name": "Called",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "call",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "settler",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15636": [
+ {
+ "length": 32,
+ "start": 155
+ },
+ {
+ "length": 32,
+ "start": 391
+ },
+ {
+ "length": 32,
+ "start": 485
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "12f09d15bff90803c31bf3647fa771bdc294726c"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json b/packages/evm/ignition/deployments/chain-8453/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
new file mode 100644
index 0000000..42a681e
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-8453/build-info/12f09d15bff90803c31bf3647fa771bdc294726c.json
@@ -0,0 +1,373 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "12f09d15bff90803c31bf3647fa771bdc294726c",
+ "solcVersion": "0.8.28",
+ "solcLongVersion": "0.8.28+commit.7893614a",
+ "userSourceNameMap": {
+ "contracts/Controller.sol": "project/contracts/Controller.sol",
+ "contracts/Intents.sol": "project/contracts/Intents.sol",
+ "contracts/Settler.sol": "project/contracts/Settler.sol",
+ "contracts/dynamic-calls/DynamicCallEncoder.sol": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "contracts/dynamic-calls/DynamicCallTypes.sol": "project/contracts/dynamic-calls/DynamicCallTypes.sol",
+ "contracts/interfaces/IController.sol": "project/contracts/interfaces/IController.sol",
+ "contracts/interfaces/ICreateX.sol": "project/contracts/interfaces/ICreateX.sol",
+ "contracts/interfaces/IDynamicCallEncoder.sol": "project/contracts/interfaces/IDynamicCallEncoder.sol",
+ "contracts/interfaces/IExecutor.sol": "project/contracts/interfaces/IExecutor.sol",
+ "contracts/interfaces/IOperationsValidator.sol": "project/contracts/interfaces/IOperationsValidator.sol",
+ "contracts/interfaces/IPaymentsReceiver.sol": "project/contracts/interfaces/IPaymentsReceiver.sol",
+ "contracts/interfaces/ISafe.sol": "project/contracts/interfaces/ISafe.sol",
+ "contracts/interfaces/ISettler.sol": "project/contracts/interfaces/ISettler.sol",
+ "contracts/interfaces/ISmartAccount.sol": "project/contracts/interfaces/ISmartAccount.sol",
+ "contracts/interfaces/ISmartAccountContract.sol": "project/contracts/interfaces/ISmartAccountContract.sol",
+ "contracts/interfaces/ISmartAccountsHandler.sol": "project/contracts/interfaces/ISmartAccountsHandler.sol",
+ "contracts/payments/PaymentsReceiver.sol": "project/contracts/payments/PaymentsReceiver.sol",
+ "contracts/proxy/Proxy.sol": "project/contracts/proxy/Proxy.sol",
+ "contracts/safeguards/BaseOperationsValidator.sol": "project/contracts/safeguards/BaseOperationsValidator.sol",
+ "contracts/safeguards/CallOperationsValidator.sol": "project/contracts/safeguards/CallOperationsValidator.sol",
+ "contracts/safeguards/DynamicCallOperationsValidator.sol": "project/contracts/safeguards/DynamicCallOperationsValidator.sol",
+ "contracts/safeguards/OperationsValidator.sol": "project/contracts/safeguards/OperationsValidator.sol",
+ "contracts/safeguards/Safeguards.sol": "project/contracts/safeguards/Safeguards.sol",
+ "contracts/safeguards/SwapOperationsValidator.sol": "project/contracts/safeguards/SwapOperationsValidator.sol",
+ "contracts/safeguards/TransferOperationsValidator.sol": "project/contracts/safeguards/TransferOperationsValidator.sol",
+ "contracts/smart-accounts/SmartAccount7702.sol": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "contracts/smart-accounts/SmartAccountBase.sol": "project/contracts/smart-accounts/SmartAccountBase.sol",
+ "contracts/smart-accounts/SmartAccountContract.sol": "project/contracts/smart-accounts/SmartAccountContract.sol",
+ "contracts/smart-accounts/SmartAccountsHandler.sol": "project/contracts/smart-accounts/SmartAccountsHandler.sol",
+ "contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol",
+ "contracts/test/CallMock.sol": "project/contracts/test/CallMock.sol",
+ "contracts/test/SettlerV2Mock.sol": "project/contracts/test/SettlerV2Mock.sol",
+ "contracts/test/TokenMock.sol": "project/contracts/test/TokenMock.sol",
+ "contracts/test/dynamic-calls/StaticCallMock.sol": "project/contracts/test/dynamic-calls/StaticCallMock.sol",
+ "contracts/test/executors/EmptyExecutorMock.sol": "project/contracts/test/executors/EmptyExecutorMock.sol",
+ "contracts/test/executors/MintExecutorMock.sol": "project/contracts/test/executors/MintExecutorMock.sol",
+ "contracts/test/executors/ReentrantExecutorMock.sol": "project/contracts/test/executors/ReentrantExecutorMock.sol",
+ "contracts/test/executors/TransferExecutorMock.sol": "project/contracts/test/executors/TransferExecutorMock.sol",
+ "contracts/test/smart-accounts/SafeMock.sol": "project/contracts/test/smart-accounts/SafeMock.sol",
+ "contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol",
+ "contracts/test/utils/BytesHelpersMock.sol": "project/contracts/test/utils/BytesHelpersMock.sol",
+ "contracts/test/utils/DenominationsMock.sol": "project/contracts/test/utils/DenominationsMock.sol",
+ "contracts/test/utils/ERC20HelpersMock.sol": "project/contracts/test/utils/ERC20HelpersMock.sol",
+ "contracts/utils/BytesHelpers.sol": "project/contracts/utils/BytesHelpers.sol",
+ "contracts/utils/Denominations.sol": "project/contracts/utils/Denominations.sol",
+ "contracts/utils/ERC20Helpers.sol": "project/contracts/utils/ERC20Helpers.sol",
+ "contracts/utils/MimicHelper.sol": "project/contracts/utils/MimicHelper.sol",
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol": "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol"
+ },
+ "input": {
+ "language": "Solidity",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000
+ },
+ "evmVersion": "cancun",
+ "outputSelection": {
+ "*": {
+ "": [
+ "ast"
+ ],
+ "*": [
+ "abi",
+ "evm.bytecode",
+ "evm.deployedBytecode",
+ "evm.methodIdentifiers",
+ "metadata"
+ ]
+ }
+ },
+ "remappings": [
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts-upgradeable/=npm/@openzeppelin/contracts-upgradeable@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/",
+ "project/:@openzeppelin/contracts/=npm/@openzeppelin/contracts@5.3.0/"
+ ]
+ },
+ "sources": {
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/access/OwnableUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/proxy/utils/Initializable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ContextUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/cryptography/EIP712Upgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts-upgradeable@5.3.0/utils/ReentrancyGuardUpgradeable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\n struct ReentrancyGuardStorage {\n uint256 _status;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\n assembly {\n $.slot := ReentrancyGuardStorageLocation\n }\n }\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if ($._status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n $._status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n $._status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\n return $._status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/access/Ownable.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n constructor(address initialOwner) {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/draft-IERC6093.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC20InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC20InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\n * @param needed Minimum amount required to perform a transfer.\n */\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC20InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n * @param spender Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n /**\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n * Used in balance queries.\n * @param owner Address of the current owner of a token.\n */\n error ERC721InvalidOwner(address owner);\n\n /**\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\n * @param tokenId Identifier number of a token.\n */\n error ERC721NonexistentToken(uint256 tokenId);\n\n /**\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param tokenId Identifier number of a token.\n * @param owner Address of the current owner of a token.\n */\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC721InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC721InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param tokenId Identifier number of a token.\n */\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC721InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n /**\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n * @param balance Current balance for the interacting account.\n * @param needed Minimum amount required to perform a transfer.\n * @param tokenId Identifier number of a token.\n */\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n /**\n * @dev Indicates a failure with the token `sender`. Used in transfers.\n * @param sender Address whose tokens are being transferred.\n */\n error ERC1155InvalidSender(address sender);\n\n /**\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\n * @param receiver Address to which tokens are being transferred.\n */\n error ERC1155InvalidReceiver(address receiver);\n\n /**\n * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n * @param owner Address of the current owner of a token.\n */\n error ERC1155MissingApprovalForAll(address operator, address owner);\n\n /**\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n * @param approver Address initiating an approval operation.\n */\n error ERC1155InvalidApprover(address approver);\n\n /**\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n * @param operator Address that may be allowed to operate on tokens without being their owner.\n */\n error ERC1155InvalidOperator(address operator);\n\n /**\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n * Used in batch transfers.\n * @param idsLength Length of the array of token identifiers\n * @param valuesLength Length of the array of token amounts\n */\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1271.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with `hash`\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1363.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n /*\n * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n * 0xb0202a11 ===\n * bytes4(keccak256('transferAndCall(address,uint256)')) ^\n * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256)')) ^\n * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n */\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n * @param from The address which you want to send tokens from.\n * @param to The address which you want to transfer to.\n * @param value The amount of tokens to be transferred.\n * @param data Additional data with no specified format, sent in call to `to`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n * @param spender The address which will spend the funds.\n * @param value The amount of tokens to be spent.\n * @param data Additional data with no specified format, sent in call to `spender`.\n * @return A boolean value indicating whether the operation succeeded unless throwing.\n */\n function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC1967.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/interfaces/IERC5267.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/beacon/IBeacon.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {Proxy} from \"../Proxy.sol\";\nimport {ERC1967Utils} from \"./ERC1967Utils.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `implementation`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `implementation`. This will typically be an\n * encoded function call, and allows initializing the storage of the proxy like a Solidity constructor.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n constructor(address implementation, bytes memory _data) payable {\n ERC1967Utils.upgradeToAndCall(implementation, _data);\n }\n\n /**\n * @dev Returns the current implementation address.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _implementation() internal view virtual override returns (address) {\n return ERC1967Utils.getImplementation();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/ERC1967/ERC1967Utils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.22;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit IERC1967.Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the ERC-1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the ERC-1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit IERC1967.BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback\n * function and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/ProxyAdmin.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.22;\n\nimport {ITransparentUpgradeableProxy} from \"./TransparentUpgradeableProxy.sol\";\nimport {Ownable} from \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgrade(address,address)`\n * and `upgradeAndCall(address,address,bytes)` are present, and `upgrade` must be used if no function should be called,\n * while `upgradeAndCall` will invoke the `receive` function if the third argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeAndCall(address,address,bytes)` is present, and the third argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev Sets the initial owner who can perform upgrades.\n */\n constructor(address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\n * See {TransparentUpgradeableProxy-_dispatchUpgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n * - If `data` is empty, `msg.value` must be zero.\n */\n function upgradeAndCall(\n ITransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/proxy/transparent/TransparentUpgradeableProxy.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.22;\n\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\nimport {ERC1967Proxy} from \"../ERC1967/ERC1967Proxy.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {ProxyAdmin} from \"./ProxyAdmin.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and its upgradeability mechanism is implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n /// @dev See {UUPSUpgradeable-upgradeToAndCall}\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable;\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable through an associated {ProxyAdmin} instance.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches the {ITransparentUpgradeableProxy-upgradeToAndCall} function exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can call the `upgradeToAndCall` function but any other call won't be forwarded to\n * the implementation. If the admin tries to call a function on the implementation it will fail with an error indicating\n * the proxy admin cannot fallback to the target implementation.\n *\n * These properties mean that the admin account can only be used for upgrading the proxy, so it's best if it's a\n * dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to\n * call a function from the proxy implementation. For this reason, the proxy deploys an instance of {ProxyAdmin} and\n * allows upgrades only if they come through it. You should think of the `ProxyAdmin` instance as the administrative\n * interface of the proxy, including the ability to change who can trigger upgrades by transferring ownership.\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead `upgradeToAndCall` is implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * NOTE: This proxy does not inherit from {Context} deliberately. The {ProxyAdmin} of this contract won't send a\n * meta-transaction in any way, and any other meta-transaction setup should be made in the implementation contract.\n *\n * IMPORTANT: This contract avoids unnecessary storage reads by setting the admin only during construction as an\n * immutable variable, preventing any changes thereafter. However, the admin slot defined in ERC-1967 can still be\n * overwritten by the implementation logic pointed to by this proxy. In such cases, the contract may end up in an\n * undesirable state where the admin slot is different from the actual admin. Relying on the value of the admin slot\n * is generally fine if the implementation is trusted.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the\n * compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new\n * function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This\n * could render the `upgradeToAndCall` function inaccessible, preventing upgradeability and compromising transparency.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n // An immutable address for the admin to avoid unnecessary SLOADs before each call\n // at the expense of removing the ability to change the admin once it's set.\n // This is acceptable if the admin is always a ProxyAdmin instance or similar contract\n // with its own ability to transfer the permissions to another account.\n address private immutable _admin;\n\n /**\n * @dev The proxy caller is the current admin, and can't fallback to the proxy target.\n */\n error ProxyDeniedAdminAccess();\n\n /**\n * @dev Initializes an upgradeable proxy managed by an instance of a {ProxyAdmin} with an `initialOwner`,\n * backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in\n * {ERC1967Proxy-constructor}.\n */\n constructor(address _logic, address initialOwner, bytes memory _data) payable ERC1967Proxy(_logic, _data) {\n _admin = address(new ProxyAdmin(initialOwner));\n // Set the storage value and emit an event for ERC-1967 compatibility\n ERC1967Utils.changeAdmin(_proxyAdmin());\n }\n\n /**\n * @dev Returns the admin of this proxy.\n */\n function _proxyAdmin() internal view virtual returns (address) {\n return _admin;\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior.\n */\n function _fallback() internal virtual override {\n if (msg.sender == _proxyAdmin()) {\n if (msg.sig != ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n revert ProxyDeniedAdminAccess();\n } else {\n _dispatchUpgradeToAndCall();\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - If `data` is empty, `msg.value` must be zero.\n */\n function _dispatchUpgradeToAndCall() private {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/ERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n mapping(address account => uint256) private _balances;\n\n mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * Both values are immutable: they can only be set once during construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `value`.\n */\n function transfer(address to, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, value);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Skips emitting an {Approval} event indicating an allowance update. This is not\n * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `value`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `value`.\n */\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, value);\n _transfer(from, to, value);\n return true;\n }\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _transfer(address from, address to, uint256 value) internal {\n if (from == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n if (to == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(from, to, value);\n }\n\n /**\n * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n * this function.\n *\n * Emits a {Transfer} event.\n */\n function _update(address from, address to, uint256 value) internal virtual {\n if (from == address(0)) {\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\n _totalSupply += value;\n } else {\n uint256 fromBalance = _balances[from];\n if (fromBalance < value) {\n revert ERC20InsufficientBalance(from, fromBalance, value);\n }\n unchecked {\n // Overflow not possible: value <= fromBalance <= totalSupply.\n _balances[from] = fromBalance - value;\n }\n }\n\n if (to == address(0)) {\n unchecked {\n // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n _totalSupply -= value;\n }\n } else {\n unchecked {\n // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n _balances[to] += value;\n }\n }\n\n emit Transfer(from, to, value);\n }\n\n /**\n * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n * Relies on the `_update` mechanism\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead.\n */\n function _mint(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidReceiver(address(0));\n }\n _update(address(0), account, value);\n }\n\n /**\n * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n * Relies on the `_update` mechanism.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * NOTE: This function is not virtual, {_update} should be overridden instead\n */\n function _burn(address account, uint256 value) internal {\n if (account == address(0)) {\n revert ERC20InvalidSender(address(0));\n }\n _update(account, address(0), value);\n }\n\n /**\n * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n *\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n _approve(owner, spender, value, true);\n }\n\n /**\n * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n *\n * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n * `Approval` event during `transferFrom` operations.\n *\n * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n * true using the following override:\n *\n * ```solidity\n * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n * super._approve(owner, spender, value, true);\n * }\n * ```\n *\n * Requirements are the same as {_approve}.\n */\n function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n if (owner == address(0)) {\n revert ERC20InvalidApprover(address(0));\n }\n if (spender == address(0)) {\n revert ERC20InvalidSpender(address(0));\n }\n _allowances[owner][spender] = value;\n if (emitEvent) {\n emit Approval(owner, spender, value);\n }\n }\n\n /**\n * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n *\n * Does not update the allowance value in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Does not emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance < type(uint256).max) {\n if (currentAllowance < value) {\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n }\n unchecked {\n _approve(owner, spender, currentAllowance - value, false);\n }\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/extensions/IERC20Metadata.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/IERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/token/ERC20/utils/SafeERC20.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n /**\n * @dev An operation with an ERC-20 token failed.\n */\n error SafeERC20FailedOperation(address token);\n\n /**\n * @dev Indicates a failed `decreaseAllowance` request.\n */\n error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n }\n\n /**\n * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n */\n function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n forceApprove(token, spender, oldAllowance + value);\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n * value, non-reverting calls are assumed to be successful.\n *\n * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n unchecked {\n uint256 currentAllowance = token.allowance(address(this), spender);\n if (currentAllowance < requestedDecrease) {\n revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n }\n forceApprove(token, spender, currentAllowance - requestedDecrease);\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n *\n * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n * set here.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n safeTransfer(token, to, value);\n } else if (!token.transferAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * Reverts if the returned value is other than `true`.\n */\n function transferFromAndCallRelaxed(\n IERC1363 token,\n address from,\n address to,\n uint256 value,\n bytes memory data\n ) internal {\n if (to.code.length == 0) {\n safeTransferFrom(token, from, to, value);\n } else if (!token.transferFromAndCall(from, to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n * targeting contracts.\n *\n * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n * once without retrying, and relies on the returned value to be true.\n *\n * Reverts if the returned value is other than `true`.\n */\n function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n if (to.code.length == 0) {\n forceApprove(token, to, value);\n } else if (!token.approveAndCall(to, value, data)) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n // bubble errors\n if iszero(success) {\n let ptr := mload(0x40)\n returndatacopy(ptr, 0, returndatasize())\n revert(ptr, returndatasize())\n }\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n\n if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n revert SafeERC20FailedOperation(address(token));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0)\n }\n return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Address.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Context.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/ECDSA.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/cryptography/MessageHashUtils.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Errors.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/ERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/introspection/IERC165.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/Math.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SafeCast.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/math/SignedMath.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Panic.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/ReentrancyGuard.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/StorageSlot.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct Int256Slot {\n int256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n */\n function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns a `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n assembly (\"memory-safe\") {\n r.slot := store.slot\n }\n }\n}\n"
+ },
+ "npm/@openzeppelin/contracts@5.3.0/utils/Strings.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n"
+ },
+ "project/contracts/Controller.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './interfaces/IController.sol';\n\n/**\n * @title Controller\n * @dev Manages allow lists for solvers, executors, proposal signers and validators\n */\ncontract Controller is IController, Ownable {\n // List of allowed solvers\n mapping (address => bool) public override isSolverAllowed;\n\n // List of allowed executors\n mapping (address => bool) public override isExecutorAllowed;\n\n // List of allowed proposal signers\n mapping (address => bool) public override isProposalSignerAllowed;\n\n // List of allowed validators\n mapping (address => bool) public override isValidatorAllowed;\n\n // Minimum number of validations allowed\n uint8 public override minValidations;\n\n /**\n * @dev Creates a new Controller contract\n * @param owner Address that will own the contract\n * @param solvers List of allowed solvers\n * @param executors List of allowed executors\n * @param proposalSigners List of allowed proposal signers\n * @param validators List of allowed validators\n * @param _minValidations Minimum number of validations allowed\n */\n constructor(\n address owner,\n address[] memory solvers,\n address[] memory executors,\n address[] memory proposalSigners,\n address[] memory validators,\n uint8 _minValidations\n ) Ownable(owner) {\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], true);\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], true);\n for (uint256 i = 0; i < proposalSigners.length; i++) _setAllowedProposalSigner(proposalSigners[i], true);\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], true);\n _setMinValidations(_minValidations);\n }\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external override onlyOwner {\n if (solvers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < solvers.length; i++) _setAllowedSolver(solvers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external override onlyOwner {\n if (executors.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < executors.length; i++) _setAllowedExecutor(executors[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external override onlyOwner {\n if (signers.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < signers.length; i++) _setAllowedProposalSigner(signers[i], alloweds[i]);\n }\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external override onlyOwner {\n if (validators.length != alloweds.length) revert ControllerInputInvalidLength();\n for (uint256 i = 0; i < validators.length; i++) _setAllowedValidator(validators[i], alloweds[i]);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external override onlyOwner {\n _setMinValidations(newMinValidations);\n }\n\n /**\n * @dev Sets a solver permission\n */\n function _setAllowedSolver(address solver, bool allowed) internal {\n isSolverAllowed[solver] = allowed;\n emit SolverAllowedSet(solver, allowed);\n }\n\n /**\n * @dev Sets an executor permission\n */\n function _setAllowedExecutor(address executor, bool allowed) internal {\n isExecutorAllowed[executor] = allowed;\n emit ExecutorAllowedSet(executor, allowed);\n }\n\n /**\n * @dev Sets a proposal signer permission\n */\n function _setAllowedProposalSigner(address signer, bool allowed) internal {\n isProposalSignerAllowed[signer] = allowed;\n emit ProposalSignerAllowedSet(signer, allowed);\n }\n\n /**\n * @dev Sets a validator permission\n */\n function _setAllowedValidator(address validator, bool allowed) internal {\n isValidatorAllowed[validator] = allowed;\n emit ValidatorAllowedSet(validator, allowed);\n }\n\n /**\n * @dev Sets the minimum number of validations allowed\n */\n function _setMinValidations(uint8 newMinValidations) internal {\n minValidations = newMinValidations;\n emit MinValidationSet(newMinValidations);\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport './DynamicCallTypes.sol';\nimport '../interfaces/IDynamicCallEncoder.sol';\nimport '../utils/BytesHelpers.sol';\n\n/**\n * @title DynamicCallEncoder\n * @dev Builds calldata for arbitrary contract calls from structured arguments.\n *\n * This encoder supports:\n * - Literal ABI-encoded arguments\n * - Variable references resolved from previous execution results\n *\n * The encoder follows standard ABI encoding rules, reconstructing\n * the calldata heads and tails dynamically based on argument types.\n */\ncontract DynamicCallEncoder is IDynamicCallEncoder {\n using BytesHelpers for bytes;\n\n /**\n * @dev Internal representation of a fully-encoded argument\n * @param data ABI-encoded argument payload:\n * - static: inline ABI words\n * - dynamic: tail data ([len][data...])\n * @param isDynamic Whether this argument requires a head offset\n * @param headLength Bytes contributed to the calldata head\n */\n struct EncodedArg {\n bytes data;\n bool isDynamic;\n uint256 headLength;\n }\n\n /**\n * @dev Encodes a dynamic call into calldata\n * @param dynamicCall Dynamic call specification\n * @param variables List of resolved variable values\n * @param variablesLength Number of resolved variables\n * @return data Fully ABI-encoded calldata\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n pure\n override\n returns (bytes memory data)\n {\n if (variablesLength > variables.length) revert DynamicCallEncoderVariablesLengthOutOfBounds();\n data = _buildCalldata(dynamicCall.selector, dynamicCall.arguments, variables, variablesLength);\n }\n\n /**\n * @dev Builds calldata from a selector and a list of dynamic arguments\n * This function performs standard ABI aggregation:\n * - static arguments are inlined in the head\n * - dynamic arguments place offsets in the head and append data to the tail\n */\n function _buildCalldata(\n bytes4 selector,\n DynamicArg[] memory args,\n bytes[][] memory variables,\n uint256 variablesLength\n ) internal pure returns (bytes memory data) {\n uint256 n = args.length;\n bytes[] memory encodedArgs = new bytes[](n);\n bool[] memory isDynamic = new bool[](n);\n uint256 headLength = 0;\n\n for (uint256 i = 0; i < n; i++) {\n EncodedArg memory enc = _encodeArg(args[i], variables, variablesLength);\n encodedArgs[i] = enc.data;\n isDynamic[i] = enc.isDynamic;\n headLength += enc.headLength;\n }\n\n bytes memory heads;\n bytes memory tails;\n uint256 nextDynamicHead = headLength;\n\n for (uint256 i = 0; i < n; i++) {\n if (isDynamic[i]) {\n heads = bytes.concat(heads, bytes32(nextDynamicHead));\n tails = bytes.concat(tails, encodedArgs[i]);\n nextDynamicHead += encodedArgs[i].length;\n } else {\n heads = bytes.concat(heads, encodedArgs[i]);\n }\n }\n\n data = bytes.concat(selector, heads, tails);\n }\n\n /**\n * @dev Encodes a single dynamic argument based on its kind\n */\n function _encodeArg(DynamicArg memory arg, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (arg.kind == DynamicArgKind.Literal) return _encodeLiteral(arg.data);\n if (arg.kind == DynamicArgKind.Variable) return _encodeVariable(arg.data, variables, variablesLength);\n revert DynamicCallEncoderInvalidArgKind();\n }\n\n /**\n * @dev Encodes a literal argument. It supports:\n * - Static values encoded as [size][data][0]\n * - Dynamic values pre-encoded with a dynamic ABI prefix\n */\n function _encodeLiteral(bytes memory argument) internal pure returns (EncodedArg memory out) {\n if (argument.length % 32 != 0) revert DynamicCallEncoderBadLength();\n\n if (_hasDynamicPrefix(argument)) {\n // Dynamic literal: remove pre-encoding prefix\n bytes memory encodedArg = argument.sliceFrom(96);\n if (encodedArg.length == 0) revert DynamicCallEncoderEmptyDynamic();\n\n out.data = encodedArg;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n // Static literal: [size][data][zero]\n if (argument.length < 64) revert DynamicCallEncoderTooShortStatic();\n\n uint256 staticSize = argument.readWord0();\n if (argument.length != staticSize + 32) revert DynamicCallEncoderBadStaticSize();\n if (!argument.lastWordIsZero()) revert DynamicCallEncoderBadStaticTrailer();\n\n bytes memory encodedArg = argument.slice(32, argument.length - 32);\n out.data = encodedArg;\n out.isDynamic = false;\n out.headLength = encodedArg.length;\n }\n }\n\n /**\n * @dev Encodes a variable argument by resolving it from the variables list\n */\n function _encodeVariable(bytes memory data, bytes[][] memory variables, uint256 variablesLength)\n internal\n pure\n returns (EncodedArg memory out)\n {\n if (data.length != 64) revert DynamicCallEncoderVariableRefBadLength();\n uint256 opIndex = data.readWord0();\n uint256 subIndex = data.readWord1();\n if (opIndex >= variablesLength) revert DynamicCallEncoderVariableOutOfBounds();\n if (subIndex >= variables[opIndex].length) revert DynamicCallEncoderVariableOutOfBounds();\n out = _encodeFromAbiLikeBytes(variables[opIndex][subIndex]);\n }\n\n /**\n * @dev Interprets ABI-like bytes as either a static or dynamic value\n * Used for variable resolution\n */\n function _encodeFromAbiLikeBytes(bytes memory value) internal pure returns (EncodedArg memory out) {\n if (value.length < 32) revert DynamicCallEncoderVariableTooShort();\n\n if (_looksLikeSingleDynamicAbiValue(value)) {\n bytes memory tail = value.sliceFrom(32);\n if (tail.length == 0) revert DynamicCallEncoderEmptyDynamic();\n out.data = tail;\n out.isDynamic = true;\n out.headLength = 32;\n } else {\n out.data = value.slice(0, 32);\n out.isDynamic = false;\n out.headLength = 32;\n }\n }\n\n /**\n * @dev Detects ABI encoding of a single dynamic return value\n */\n function _looksLikeSingleDynamicAbiValue(bytes memory data) private pure returns (bool) {\n if (data.length < 64) return false;\n if (data.length % 32 != 0) return false;\n return data.readWord0() == 0x20;\n }\n\n /**\n * @dev Detects the dynamic pre-encoding prefix used by abi.encode(\"\", value)\n */\n function _hasDynamicPrefix(bytes memory argument) private pure returns (bool) {\n if (argument.length < 96) return false;\n\n bytes32 w0;\n bytes32 w1;\n bytes32 w2;\n\n assembly {\n let off := add(argument, 32)\n w0 := mload(off)\n w1 := mload(add(off, 32))\n w2 := mload(add(off, 64))\n }\n\n return (uint256(w0) == 0x40) && (uint256(w1) == 0x60) && (w2 == bytes32(0));\n }\n}\n"
+ },
+ "project/contracts/dynamic-calls/DynamicCallTypes.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Kind of dynamic argument to be encoded\n * @param Literal ABI-encoded literal value provided by the resolver\n * @param Variable Reference to a previously resolved variable value\n */\nenum DynamicArgKind {\n Literal,\n Variable\n}\n\n/**\n * @dev Represents a single dynamic argument\n * @param kind Type of argument resolution strategy\n * @param data Encoded argument data, interpreted based on `kind`\n */\nstruct DynamicArg {\n DynamicArgKind kind;\n bytes data;\n}\n\n/**\n * @dev Represents a dynamic contract call intent\n * @param target Contract address to be called\n * @param value ETH value to be sent with the call\n * @param selector Function selector to invoke\n * @param arguments List of dynamically resolved arguments\n */\nstruct DynamicCall {\n address target;\n uint256 value;\n bytes4 selector;\n DynamicArg[] arguments;\n}\n"
+ },
+ "project/contracts/Intents.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Enum representing the operation type.\n * - Swap: Swap tokens in the same chain.\n * - Transfer: Transfer tokens to one or more recipients.\n * - Call: Execute arbitrary contract calls.\n * - CrossChainSwap: Swap tokens between chains.\n * - DynamicCall: Execute arbitrary dynamic contract calls.\n */\nenum OpType {\n Swap,\n Transfer,\n Call,\n CrossChainSwap,\n DynamicCall\n}\n\n/**\n * @dev EIP-712 typed data struct representing a validator's approval of an intent.\n * @param intent The hash of the intent being validated.\n */\nstruct Validation {\n bytes32 intent;\n}\n\n/**\n * @dev General intent structure with different operations.\n * @param feePayer The payer of the intent.\n * @param settler The address responsible for executing the intent on-chain.\n * @param nonce A unique value used to prevent replay attacks and distinguish intents.\n * @param deadline The timestamp by which the intent must be executed.\n * @param maxFees List of max fees the feePayer is willing to pay for the intent.\n * @param triggerSig The signature of the trigger that this intent belongs to\n * @param minValidations The minimum number of validator approvals required for this intent to be considered valid.\n * @param validations The list validator signatures attesting to this intent.\n * @param operations List of operations of the intent.\n */\nstruct Intent {\n address feePayer;\n address settler;\n bytes32 nonce;\n uint256 deadline;\n MaxFee[] maxFees;\n bytes triggerSig;\n uint256 minValidations;\n bytes[] validations;\n Operation[] operations;\n}\n\n/**\n * @dev Operation structure used to abstract over different operation types.\n * @param opType The type of operation this operation represents.\n * @param user The user of the operation.\n * @param data ABI-encoded data representing a specific operation type (e.g. SwapOperation, TransferOperation, CallOperation).\n * @param events List of custom operation events to be emitted.\n */\nstruct Operation {\n uint8 opType;\n address user;\n bytes data;\n OperationEvent[] events;\n}\n\n/**\n * @dev Max fee representation\n * @param token Token used to pay for the execution fee.\n * @param amount Max amount of fee token to be paid for settling this intent.\n */\nstruct MaxFee {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Operation event representation.\n * @param topic Event topic to be emitted.\n * @param data Event data to be emitted.\n */\nstruct OperationEvent {\n bytes32 topic;\n bytes data;\n}\n\n/**\n * @dev Represents a swap operation between two chains.\n * @param sourceChain Chain ID where tokens will be sent from.\n * @param destinationChain Chain ID where tokens will be received.\n * @param tokensIn List of input tokens and amounts to swap.\n * @param tokensOut List of expected output tokens, minimum amounts, and recipients.\n */\nstruct SwapOperation {\n uint256 sourceChain;\n uint256 destinationChain;\n TokenIn[] tokensIn;\n TokenOut[] tokensOut;\n}\n\n/**\n * @dev Token in representation.\n * @param token Address of a token to be sent.\n * @param amount Amount of tokens to be sent.\n */\nstruct TokenIn {\n address token;\n uint256 amount;\n}\n\n/**\n * @dev Token out representation.\n * @param token Address of a token to be received.\n * @param minAmount Minimum amount of tokens to be received.\n * @param recipient Recipient address that will receive the token out.\n */\nstruct TokenOut {\n address token;\n uint256 minAmount;\n address recipient;\n}\n\n/**\n * @dev Represents a transfer operation containing multiple token transfers.\n * @param chainId Chain ID where the transfers should be executed.\n * @param transfers List of token transfers to be performed.\n */\nstruct TransferOperation {\n uint256 chainId;\n TransferData[] transfers;\n}\n\n/**\n * @dev Transfer data for a single token transfer.\n * @param token Address of the token to transfer.\n * @param amount Amount of the token to transfer.\n * @param recipient Recipient of the token transfer.\n */\nstruct TransferData {\n address token;\n uint256 amount;\n address recipient;\n}\n\n/**\n * @dev Represents a generic call operation consisting of one or more contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of low-level contract calls to be executed.\n */\nstruct CallOperation {\n uint256 chainId;\n CallData[] calls;\n}\n\n/**\n * @dev Low-level call data for a target contract interaction.\n * @param target Target contract address.\n * @param data Calldata to be sent to the target.\n * @param value ETH value to send along with the call.\n */\nstruct CallData {\n address target;\n bytes data;\n uint256 value;\n}\n\n/**\n * @dev Represents a generic dynamic call operation consisting of one or more dynamic contract calls.\n * @param chainId Chain ID where the calls should be executed.\n * @param calls List of ABI-encoded low-level dynamic contract calls to be executed.\n */\nstruct DynamicCallOperation {\n uint256 chainId;\n bytes[] calls;\n}\n\n/**\n * @dev Generic proposal structure representing a solver’s response to an intent.\n * @param deadline Timestamp until when the proposal is valid.\n * @param datas List of ABI-encoded proposal-specific data (e.g. SwapProposal).\n * @param fees List of fee amounts the solver requires for execution.\n */\nstruct Proposal {\n uint256 deadline;\n bytes[] datas;\n uint256[] fees;\n}\n\n/**\n * @dev Swap proposal representation for a swap operation.\n * @param executor Address of the executor contract that should be called during operation execution.\n * @param data Arbitrary data used to call the executor contract.\n * @param amountsOut List of amounts of tokens out proposed by the solver.\n */\nstruct SwapProposal {\n address executor;\n bytes data;\n uint256[] amountsOut;\n}\n\nlibrary IntentsHelpers {\n bytes32 internal constant INTENT_TYPE_HASH =\n keccak256(\n 'Intent(address feePayer,address settler,bytes32 nonce,uint256 deadline,MaxFee[] maxFees,bytes triggerSig,uint256 minValidations,Operation[] operations)MaxFee(address token,uint256 amount)Operation(uint8 opType,address user,bytes data,OperationEvent[] events)OperationEvent(bytes32 topic,bytes data)'\n );\n\n bytes32 internal constant PROPOSAL_TYPE_HASH =\n keccak256('Proposal(bytes32 intent,address solver,uint256 deadline,bytes[] datas,uint256[] fees)');\n\n bytes32 internal constant VALIDATION_TYPE_HASH = keccak256('Validation(bytes32 intent)');\n\n bytes32 internal constant MAX_FEE_TYPE_HASH = keccak256('MaxFee(address token,uint256 amount)');\n\n bytes32 internal constant OPERATION_TYPE_HASH =\n keccak256('Operation(uint8 opType,address user,bytes data,OperationEvent[] events)');\n\n bytes32 internal constant OPERATION_EVENT_TYPE_HASH = keccak256('OperationEvent(bytes32 topic,bytes data)');\n\n function hash(Intent memory intent) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n INTENT_TYPE_HASH,\n intent.feePayer,\n intent.settler,\n intent.nonce,\n intent.deadline,\n hash(intent.maxFees),\n intent.triggerSig,\n intent.minValidations,\n hash(intent.operations)\n )\n );\n }\n\n function hash(Proposal memory proposal, Intent memory intent, address solver) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n PROPOSAL_TYPE_HASH,\n hash(intent),\n solver,\n proposal.deadline,\n hash(proposal.datas),\n hash(proposal.fees)\n )\n );\n }\n\n function hash(MaxFee[] memory fees) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](fees.length);\n for (uint256 i = 0; i < fees.length; i++) {\n hashes[i] = keccak256(abi.encode(MAX_FEE_TYPE_HASH, fees[i].token, fees[i].amount));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation[] memory operations) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](operations.length);\n for (uint256 i = 0; i < operations.length; i++) hashes[i] = hash(operations[i]);\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Operation memory operation) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n OPERATION_TYPE_HASH,\n operation.opType,\n operation.user,\n keccak256(operation.data),\n hash(operation.events)\n )\n );\n }\n\n function hash(OperationEvent[] memory events) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](events.length);\n for (uint256 i = 0; i < events.length; i++) {\n hashes[i] = keccak256(abi.encode(OPERATION_EVENT_TYPE_HASH, events[i].topic, keccak256(events[i].data)));\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(uint256[] memory fees) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(fees));\n }\n\n function hash(bytes[] memory datas) internal pure returns (bytes32) {\n bytes32[] memory hashes = new bytes32[](datas.length);\n for (uint256 i = 0; i < datas.length; i++) {\n hashes[i] = keccak256(datas[i]);\n }\n return keccak256(abi.encodePacked(hashes));\n }\n\n function hash(Validation memory validation) internal pure returns (bytes32) {\n return keccak256(abi.encode(VALIDATION_TYPE_HASH, validation.intent));\n }\n}\n"
+ },
+ "project/contracts/interfaces/IController.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title Controller interface\n */\ninterface IController {\n /**\n * @dev The input arrays are not of equal length\n */\n error ControllerInputInvalidLength();\n\n /**\n * @dev Emitted every time a solver permission is set\n */\n event SolverAllowedSet(address indexed solver, bool allowed);\n\n /**\n * @dev Emitted every time an executor permission is set\n */\n event ExecutorAllowedSet(address indexed executor, bool allowed);\n\n /**\n * @dev Emitted every time a proposal signer permission is set\n */\n event ProposalSignerAllowedSet(address indexed proposalSigner, bool allowed);\n\n /**\n * @dev Emitted every time a validator permission is set\n */\n event ValidatorAllowedSet(address indexed validator, bool allowed);\n\n /**\n * @dev Emitted when the minimum validations changes\n */\n event MinValidationSet(uint8 indexed newMinValidation);\n\n /**\n * @dev Tells whether a solver is allowed\n * @param solver Address of the solver being queried\n */\n function isSolverAllowed(address solver) external view returns (bool);\n\n /**\n * @dev Tells whether an executor is allowed\n * @param executor Address of the executor being queried\n */\n function isExecutorAllowed(address executor) external view returns (bool);\n\n /**\n * @dev Tells whether a proposal signer is allowed\n * @param signer Address of the proposal signer being queried\n */\n function isProposalSignerAllowed(address signer) external view returns (bool);\n\n /**\n * @dev Tells whether a validator is allowed\n * @param validator Address of the validator being queried\n */\n function isValidatorAllowed(address validator) external view returns (bool);\n\n /**\n * @dev Tells the minimum number of validations allowed\n */\n function minValidations() external view returns (uint8);\n\n /**\n * @dev Sets permissions for multiple solvers\n * @param solvers List of solver addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedSolvers(address[] memory solvers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple executors\n * @param executors List of executor addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedExecutors(address[] memory executors, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple proposal signers\n * @param signers List of proposal signer addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedProposalSigners(address[] memory signers, bool[] memory alloweds) external;\n\n /**\n * @dev Sets permissions for multiple validators\n * @param validators List of validator addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedValidators(address[] memory validators, bool[] memory alloweds) external;\n\n /**\n * @dev Sets the minimum number of validations allowed\n * @param newMinValidations minimum number of validations allowed\n */\n function setMinValidations(uint8 newMinValidations) external;\n}\n"
+ },
+ "project/contracts/interfaces/ICreateX.sol": {
+ "content": "// SPDX-License-Identifier: AGPL-3.0-only\n\npragma solidity ^0.8.4;\n\n/**\n * @title CreateX Factory Interface Definition\n * @author pcaversaccio (https://web.archive.org/web/20230921103111/https://pcaversaccio.com/)\n * @custom:coauthor Matt Solomon (https://web.archive.org/web/20230921103335/https://mattsolomon.dev/)\n */\ninterface ICreateX {\n event ContractCreation(address indexed newContract);\n\n function deployCreate3(bytes32 salt, bytes memory initCode) external payable returns (address newContract);\n}\n"
+ },
+ "project/contracts/interfaces/IDynamicCallEncoder.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\ninterface IDynamicCallEncoder {\n /**\n * @dev The argument is not word-aligned\n */\n error DynamicCallEncoderBadLength();\n\n /**\n * @dev The dynamic value resolves to empty data\n */\n error DynamicCallEncoderEmptyDynamic();\n\n /**\n * @dev The static literal has an invalid size prefix\n */\n error DynamicCallEncoderBadStaticSize();\n\n /**\n * @dev The static literal does not end with a zero word\n */\n error DynamicCallEncoderBadStaticTrailer();\n\n /**\n * @dev The static literal is too short to be valid\n */\n error DynamicCallEncoderTooShortStatic();\n\n /**\n * @dev The variable reference is not exactly one word\n */\n error DynamicCallEncoderVariableRefBadLength();\n\n /**\n * @dev The variable index is outside the variables array\n */\n error DynamicCallEncoderVariableOutOfBounds();\n\n /**\n * @dev The declared variables length exceeds the variables array length\n */\n error DynamicCallEncoderVariablesLengthOutOfBounds();\n\n /**\n * @dev The variable value is too short to be interpreted\n */\n error DynamicCallEncoderVariableTooShort();\n\n /**\n * @dev The argument kind is not valid\n */\n error DynamicCallEncoderInvalidArgKind();\n\n /**\n * @dev Encodes a dynamic call into calldata.\n * @param dynamicCall Dynamic call specification.\n * @param variables List of resolved variable values.\n * @param variablesLength Number of resolved variables.\n */\n function encode(DynamicCall memory dynamicCall, bytes[][] memory variables, uint256 variablesLength)\n external\n view\n returns (bytes memory);\n}\n"
+ },
+ "project/contracts/interfaces/IExecutor.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\n\n/**\n * @title Executor interface\n */\ninterface IExecutor {\n /**\n * @dev Executes an operation proposal\n * @param intent Intent that contains swap operation to be executed\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external;\n}\n"
+ },
+ "project/contracts/interfaces/IOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ninterface IOperationsValidator {\n /**\n * @dev Validates an operation for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure;\n}\n"
+ },
+ "project/contracts/interfaces/IPaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @title PaymentsReceiver interface\n */\ninterface IPaymentsReceiver {\n /**\n * @dev The token address is zero\n */\n error PaymentsReceiverTokenZero();\n\n /**\n * @dev The recipient address is zero\n */\n error PaymentsReceiverRecipientZero();\n\n /**\n * @dev The amount is zero\n */\n error PaymentsReceiverAmountZero();\n\n /**\n * @dev The user address is zero\n */\n error PaymentsReceiverUserZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error PaymentsReceiverInputInvalidLength();\n\n /**\n * @dev The token is not allowed\n */\n error PaymentsReceiverTokenNotAllowed(address token);\n\n /**\n * @dev Emitted every time a deposit is made\n */\n event Deposited(\n address indexed token,\n address indexed depositor,\n address indexed user,\n uint256 amount,\n uint8 decimals\n );\n\n /**\n * @dev Emitted every time a withdrawal is made\n */\n event Withdrawn(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time a token permission is set\n */\n event TokenAllowedSet(address indexed token, bool allowed);\n\n /**\n * @dev Tells whether a token is allowed\n * @param token Address of the token being queried\n */\n function isTokenAllowed(address token) external view returns (bool);\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external;\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external;\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external;\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISafe.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nenum SafeOperation {\n Call,\n DelegateCall\n}\n\ninterface ISafe {\n function getThreshold() external view returns (uint256);\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory returnData);\n}\n"
+ },
+ "project/contracts/interfaces/ISettler.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../Intents.sol';\nimport '../safeguards/Safeguards.sol';\n\n/**\n * @title Settler interface\n */\ninterface ISettler {\n /**\n * @dev The requested operation type is unknown\n */\n error SettlerUnknownOperationType(uint8 opType);\n\n /**\n * @dev The simulation has been successful\n */\n error SettlerSimulationSuccess(uint256 gasUsed);\n\n /**\n * @dev The solver is not allowed\n */\n error SettlerSolverNotAllowed(address solver);\n\n /**\n * @dev The executor is not allowed\n */\n error SettlerExecutorNotAllowed(address executor);\n\n /**\n * @dev The proposal signer is not allowed\n */\n error SettlerProposalSignerNotAllowed(address signer);\n\n /**\n * @dev The validator is not allowed\n */\n error SettlerValidatorNotAllowed(address validator);\n\n /**\n * @dev The validator is duplicated\n */\n error SettlerValidatorDuplicatedOrUnsorted(address previous, address current);\n\n /**\n * @dev The settler is not the current contract\n */\n error SettlerInvalidSettler(address settler);\n\n /**\n * @dev The nonce is zero\n */\n error SettlerNonceZero();\n\n /**\n * @dev The intent has already been executed\n */\n error SettlerIntentAlreadyExecuted(bytes32 hash);\n\n /**\n * @dev The intent deadline is in the past\n */\n error SettlerIntentPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The current chain is not valid\n */\n error SettlerInvalidChain(uint256 chainId);\n\n /**\n * @dev The recipient is the settler contract\n */\n error SettlerInvalidRecipient(address to);\n\n /**\n * @dev The user is not a smart account\n */\n error SettlerUserNotSmartAccount(address user);\n\n /**\n * @dev The amount out is lower than the proposed amount\n */\n error SettlerAmountOutLtProposed(uint256 index, uint256 amountOut, uint256 proposed);\n\n /**\n * @dev The proposed amount is lower than the minimum amount\n */\n error SettlerProposedAmountLtMinAmount(uint256 index, uint256 proposed, uint256 minAmount);\n\n /**\n * @dev The proposed amounts array and the tokens out array are not of equal length\n */\n error SettlerInvalidProposedAmounts();\n\n /**\n * @dev The balance after the proposal execution is lower than the balance before\n */\n error SettlerPostBalanceOutLtPre(uint256 index, uint256 post, uint256 pre);\n\n /**\n * @dev The solver fees length does not match the requested by the user\n */\n error SettlerSolverFeeInvalidLength();\n\n /**\n * @dev The intent operations array is empty\n */\n error SettlerIntentOperationsEmpty();\n\n /**\n * @dev The proposal datas length does not match the intent operations length\n */\n error SettlerProposalDataInvalidLength();\n\n /**\n * @dev The solver fee is too high\n */\n error SettlerSolverFeeTooHigh(uint256 fee, uint256 max);\n\n /**\n * @dev The intent validations are not enough\n */\n error SettlerIntentValidationsNotEnough(uint256 min, uint256 current);\n\n /**\n * @dev The proposal deadline is in the past\n */\n error SettlerProposalPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The proposal data is not empty\n */\n error SettlerProposalDataNotEmpty();\n\n /**\n * @dev The rescue funds recipient is zero\n */\n error SettlerRescueFundsRecipientZero();\n\n /**\n * @dev The list of safeguards exceed the maximum allowed\n */\n error SettlerTooManySafeguards(uint256 lengthRequested);\n\n /**\n * @dev The chains of a swap operation do not match the swap type (single or cross chain)\n */\n error SettlerOperationChainsMismatch();\n\n /**\n * @dev A CrossChainSwap operation must be the only operation in the intent\n */\n error SettlerCrossChainSwapMustBeOnlyOperation();\n\n /**\n * @dev The new smart accounts handler is zero\n */\n error SmartAccountsHandlerZero();\n\n /**\n * @dev The new dynamic call encoder is zero\n */\n error SettlerDynamicCallEncoderZero();\n\n /**\n * @dev Custom events emitted for each operation\n */\n event OperationExecuted(\n address indexed user,\n bytes32 indexed topic,\n uint8 indexed opType,\n Operation operation,\n Proposal proposal,\n bytes32 intentHash,\n uint256 index,\n bytes output,\n bytes data\n );\n\n /**\n * @dev Emitted every time an intent is fulfilled\n */\n event ProposalExecuted(bytes32 indexed proposal);\n\n /**\n * @dev Emitted every time tokens are withdrawn from the contract balance\n */\n event FundsRescued(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time the smart accounts handler is set\n */\n event SmartAccountsHandlerSet(address indexed smartAccountsHandler);\n\n /**\n * @dev Emitted every time the operations validator is set\n */\n event OperationsValidatorSet(address indexed operationsValidator);\n\n /**\n * @dev Emitted every time the dynamic call encoder is set\n */\n event DynamicCallEncoderSet(address indexed dynamicCallEncoder);\n\n /**\n * @dev Emitted every time a safeguard is set\n */\n event SafeguardSet(address indexed user);\n\n /**\n * @dev Tells the reference to the Mimic controller\n */\n function controller() external view returns (address);\n\n /**\n * @dev Tells the reference to the smart accounts handler\n */\n function smartAccountsHandler() external view returns (address);\n\n /**\n * @dev Tells the reference to the operations validator\n */\n function operationsValidator() external view returns (address);\n\n /**\n * @dev Tells the reference to the dynamic call encoder\n */\n function dynamicCallEncoder() external view returns (address);\n\n /**\n * @dev Tells the block at which an intent was executed. Returns 0 if unexecuted.\n * @param hash Hash of the intent being queried\n */\n function getIntentBlock(bytes32 hash) external view returns (uint256);\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view returns (bytes memory);\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure returns (bytes32);\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n returns (bytes32);\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external;\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external;\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external;\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external;\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature) external;\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccount.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/introspection/IERC165.sol';\n\n/**\n * @title SmartAccount interface\n */\ninterface ISmartAccount is IERC165 {\n /**\n * @dev Emitted every time tokens are transferred\n */\n event Transferred(address indexed token, address indexed recipient, uint256 amount);\n\n /**\n * @dev Emitted every time `call` is called\n */\n event Called(address indexed target, bytes data, uint256 value, bytes result);\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) external;\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n */\n function call(address target, bytes memory data, uint256 value) external returns (bytes memory result);\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/interfaces/IERC1271.sol';\n\nimport './ISmartAccount.sol';\n\n/**\n * @title SmartAccountContract interface\n */\ninterface ISmartAccountContract is ISmartAccount, IERC1271 {\n // solhint-disable-previous-line no-empty-blocks\n}\n"
+ },
+ "project/contracts/interfaces/ISmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\ninterface ISmartAccountsHandler {\n /**\n * @dev The smart account given is not supported\n */\n error SmartAccountsHandlerUnsupportedAccount(address account);\n\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view returns (bool);\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external;\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value) external returns (bytes memory);\n}\n"
+ },
+ "project/contracts/payments/PaymentsReceiver.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\n\nimport '../interfaces/IPaymentsReceiver.sol';\n\n/**\n * @title PaymentsReceiver\n * @dev Receives ERC20 deposits and lets the owner withdraw them\n */\ncontract PaymentsReceiver is IPaymentsReceiver, Ownable {\n using SafeERC20 for IERC20;\n\n // List of allowed tokens\n mapping (address => bool) public override isTokenAllowed;\n\n /**\n * @dev Creates a new PaymentsReceiver contract\n * @param owner Address that will own the contract\n * @param tokens List of allowed tokens\n */\n constructor(address owner, address[] memory tokens) Ownable(owner) {\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], true);\n }\n\n /**\n * @dev Sets permissions for multiple tokens\n * @param tokens List of token addresses\n * @param alloweds List of permission statuses\n */\n function setAllowedTokens(address[] memory tokens, bool[] memory alloweds) external override onlyOwner {\n if (tokens.length != alloweds.length) revert PaymentsReceiverInputInvalidLength();\n for (uint256 i = 0; i < tokens.length; i++) _setAllowedToken(tokens[i], alloweds[i]);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param amount Amount to deposit\n */\n function deposit(address token, uint256 amount) external override {\n _deposit(token, _msgSender(), amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens on behalf of a user\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function depositOnBehalf(address token, address user, uint256 amount) external override {\n if (user == address(0)) revert PaymentsReceiverUserZero();\n _deposit(token, user, amount);\n }\n\n /**\n * @dev Withdraws ERC20 tokens to a recipient\n * @param token Address of the token to withdraw\n * @param recipient Address of the recipient\n * @param amount Amount to withdraw\n */\n function withdraw(address token, address recipient, uint256 amount) external override onlyOwner {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (recipient == address(0)) revert PaymentsReceiverRecipientZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n\n IERC20(token).safeTransfer(recipient, amount);\n\n emit Withdrawn(token, recipient, amount);\n }\n\n /**\n * @dev Deposits ERC20 tokens into the contract\n * @param token Address of the token to deposit\n * @param user Address to attribute the deposit to\n * @param amount Amount to deposit\n */\n function _deposit(address token, address user, uint256 amount) internal {\n if (token == address(0)) revert PaymentsReceiverTokenZero();\n if (amount == 0) revert PaymentsReceiverAmountZero();\n if (!isTokenAllowed[token]) revert PaymentsReceiverTokenNotAllowed(token);\n\n address depositor = _msgSender();\n IERC20(token).safeTransferFrom(depositor, address(this), amount);\n\n uint8 decimals = IERC20Metadata(token).decimals();\n emit Deposited(token, depositor, user, amount, decimals);\n }\n\n /**\n * @dev Sets a token permission\n */\n function _setAllowedToken(address token, bool allowed) internal {\n isTokenAllowed[token] = allowed;\n emit TokenAllowedSet(token, allowed);\n }\n}\n"
+ },
+ "project/contracts/proxy/Proxy.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';\n\ncontract Proxy is TransparentUpgradeableProxy {\n constructor(address implementation, address initialOwner, bytes memory data)\n TransparentUpgradeableProxy(implementation, initialOwner, data)\n {}\n}\n"
+ },
+ "project/contracts/safeguards/BaseOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @title BaseOperationsValidator\n */\ncontract BaseOperationsValidator {\n /**\n * @dev No operations allowed\n */\n error OperationsValidatorNoneAllowed();\n\n /**\n * @dev Operation type unknown\n */\n error OperationsValidatorUnknownOperationType(uint8 opType);\n\n /**\n * @dev Invalid safeguard mode\n */\n error OperationsValidatorInvalidSafeguardMode(uint8 mode);\n\n /**\n * @dev Tells whether a chain is allowed\n */\n function _isChainAllowed(uint256 chainId, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, uint256[] memory values) = abi.decode(config, (bool, uint256[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (chainId == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is allowed\n */\n function _isAccountAllowed(address account, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, address[] memory values) = abi.decode(config, (bool, address[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (account == values[i]) return true;\n }\n return false;\n }\n }\n\n /**\n * @dev Tells whether a selector is allowed\n */\n function _isSelectorAllowed(bytes4 selector, bytes memory config) internal pure returns (bool) {\n (bool isDenyList, bytes4[] memory values) = abi.decode(config, (bool, bytes4[]));\n if (isDenyList) {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return false;\n }\n return true;\n } else {\n for (uint256 i = 0; i < values.length; i++) {\n if (selector == values[i]) return true;\n }\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/safeguards/CallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Call safeguard modes to validate call operations\n * @param None To ensure no calls are allowed\n * @param Chain To validate that the chain where calls execute is allowed\n * @param Target To validate that the call targets (contract addresses) are allowed\n * @param Selector To validate that the function selectors being called are allowed\n */\nenum CallSafeguardMode {\n None,\n Chain,\n Target,\n Selector\n}\n\n/**\n * @title CallOperationsValidator\n * @dev Performs call operations validations based on safeguards\n */\ncontract CallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a call operation is valid for a safeguard\n * @param operation Call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(callOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areCallTargetsValid(callOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areCallSelectorsValid(callOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the call targets are allowed\n */\n function _areCallTargetsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isAccountAllowed(calls[i].target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the call selectors are allowed\n */\n function _areCallSelectorsValid(CallData[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n if (!_isSelectorAllowed(bytes4(calls[i].data), config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/DynamicCallOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './BaseOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../dynamic-calls/DynamicCallTypes.sol';\n\n/**\n * @title DynamicCallOperationsValidator\n * @dev Performs dynamic call operations validations based on call safeguards\n */\ncontract DynamicCallOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a dynamic call operation is valid for a safeguard\n * @param operation Dynamic call operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isDynamicCallOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n if (safeguard.mode == uint8(CallSafeguardMode.Chain))\n return _isChainAllowed(dynamicCallOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Target))\n return _areDynamicCallTargetsValid(dynamicCallOperation.calls, safeguard.config);\n if (safeguard.mode == uint8(CallSafeguardMode.Selector))\n return _areDynamicCallSelectorsValid(dynamicCallOperation.calls, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the dynamic call targets are allowed\n */\n function _areDynamicCallTargetsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isAccountAllowed(call.target, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the dynamic call selectors are allowed\n */\n function _areDynamicCallSelectorsValid(bytes[] memory calls, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < calls.length; i++) {\n DynamicCall memory call = abi.decode(calls[i], (DynamicCall));\n if (!_isSelectorAllowed(call.selector, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/OperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './CallOperationsValidator.sol';\nimport './DynamicCallOperationsValidator.sol';\nimport './TransferOperationsValidator.sol';\nimport './Safeguards.sol';\nimport './SwapOperationsValidator.sol';\nimport '../Intents.sol';\nimport '../interfaces/IOperationsValidator.sol';\n\n/**\n * @title OperationsValidator\n * @dev Performs operations validations based on safeguards\n */\ncontract OperationsValidator is\n IOperationsValidator,\n SwapOperationsValidator,\n TransferOperationsValidator,\n CallOperationsValidator,\n DynamicCallOperationsValidator\n{\n /**\n * @dev Safeguard validation failed\n */\n error OperationsValidatorSafeguardFailed();\n\n /**\n * @dev Invalid safeguard config mode\n */\n error OperationsValidatorInvalidSafeguardConfigMode(uint8 mode);\n\n /**\n * @dev Invalid safeguard group logic mode\n */\n error OperationsValidatorInvalidSafeguardGroupLogicMode(uint8 mode);\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param config Safeguard config to validate the operation with\n */\n function validate(Operation memory operation, bytes memory config) external pure override {\n (uint8 mode, bytes memory safeguard) = abi.decode(config, (uint8, bytes));\n if (mode == uint8(SafeguardConfigMode.List)) _validate(operation, abi.decode(safeguard, (Safeguard[])));\n else if (mode == uint8(SafeguardConfigMode.Tree)) _validate(operation, _decodeSafeguardTree(safeguard));\n else revert OperationsValidatorInvalidSafeguardConfigMode(mode);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguards list\n * @param operation Operation to be validated\n * @param safeguards Safeguard list to validate the operation with\n */\n function _validate(Operation memory operation, Safeguard[] memory safeguards) internal pure {\n if (safeguards.length == 0) revert OperationsValidatorSafeguardFailed();\n for (uint256 i = 0; i < safeguards.length; i++) {\n if (!_isSafeguardValid(operation, safeguards[i])) revert OperationsValidatorSafeguardFailed();\n }\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n */\n function _validate(Operation memory operation, SafeguardTree memory tree) internal pure {\n if (tree.nodes.length == 0) revert OperationsValidatorSafeguardFailed();\n if (!_isSafeguardGroupValid(operation, tree, 0)) revert OperationsValidatorSafeguardFailed();\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard tree at a certain level\n * @param operation Operation to be validated\n * @param tree Safeguard tree to validate the operation with\n * @param index Index of the group node to evaluate\n */\n function _isSafeguardGroupValid(Operation memory operation, SafeguardTree memory tree, uint16 index)\n internal\n pure\n returns (bool)\n {\n SafeguardGroup memory group = tree.nodes[index];\n\n if (group.logic == uint8(SafeguardGroupLogic.NOT)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.AND)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (!_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (!_isSafeguardGroupValid(operation, tree, group.children[i])) return false;\n }\n return true;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.OR)) {\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]])) return true;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i])) return true;\n }\n return false;\n }\n\n if (group.logic == uint8(SafeguardGroupLogic.XOR)) {\n uint256 hits = 0;\n for (uint256 i = 0; i < group.leaves.length; i++) {\n if (_isSafeguardValid(operation, tree.leaves[group.leaves[i]]))\n if (++hits > 1) return false;\n }\n for (uint256 i = 0; i < group.children.length; i++) {\n if (_isSafeguardGroupValid(operation, tree, group.children[i]))\n if (++hits > 1) return false;\n }\n return hits == 1;\n }\n\n revert OperationsValidatorInvalidSafeguardGroupLogicMode(group.logic);\n }\n\n /**\n * @dev Tells whether an operation is valid for a safeguard\n * @param operation Operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSafeguardValid(Operation memory operation, Safeguard memory safeguard) internal pure returns (bool) {\n if (safeguard.mode == uint8(0)) revert OperationsValidatorNoneAllowed();\n if (operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap)) {\n return _isSwapOperationValid(operation, safeguard);\n }\n if (operation.opType == uint8(OpType.Transfer)) return _isTransferOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.Call)) return _isCallOperationValid(operation, safeguard);\n if (operation.opType == uint8(OpType.DynamicCall)) return _isDynamicCallOperationValid(operation, safeguard);\n revert OperationsValidatorUnknownOperationType(uint8(operation.opType));\n }\n\n /**\n * @dev Safely decodes a safeguard tree avoiding compiler issues with dynamic arrays\n * @param data Safeguard tree data to be decoded\n */\n function _decodeSafeguardTree(bytes memory data) private pure returns (SafeguardTree memory) {\n (SafeguardGroup[] memory nodes, Safeguard[] memory leaves) = abi.decode(data, (SafeguardGroup[], Safeguard[]));\n return SafeguardTree(nodes, leaves);\n }\n}\n"
+ },
+ "project/contracts/safeguards/Safeguards.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Safeguard config modes\n * - List: Safeguard lists\n * - Tree: Safeguard groups\n */\nenum SafeguardConfigMode {\n List,\n Tree\n}\n\n/**\n * @dev Logical operators for safeguard groups\n * - AND: every child must pass\n * - OR: at least one child must pass\n * - XOR: exactly one child must pass\n * - NOT: every child must fail\n */\nenum SafeguardGroupLogic {\n AND,\n OR,\n XOR,\n NOT\n}\n\n/**\n * @dev Flat node in the safeguard tree\n * @param logic Group operator (AND/OR/XOR/NOT)\n * @param leaves Indices into `SafeguardTree.leaves`\n * @param children Indices into `SafeguardTree.nodes`\n */\nstruct SafeguardGroup {\n uint8 logic;\n uint16[] leaves;\n uint16[] children;\n}\n\n/**\n * @dev Safeguard tree representation\n * @param nodes List of all the nodes in the tree\n * @param leaves List of all the leaves in the tree\n */\nstruct SafeguardTree {\n SafeguardGroup[] nodes;\n Safeguard[] leaves;\n}\n\n/**\n * @dev Safeguard representation\n * @param mode Safeguard mode\n * @param config Safeguard configuration settings or parameters\n */\nstruct Safeguard {\n uint8 mode;\n bytes config;\n}\n"
+ },
+ "project/contracts/safeguards/SwapOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Swap safeguard modes to validate swap operations\n * @param None To ensure no swaps are allowed\n * @param SourceChain To validate that the source chain is allowed\n * @param DestinationChain To validate that the destination chain is allowed\n * @param TokenIn To validate that the tokens to be sent are allowed\n * @param TokenOut To validate that the tokens to be received are allowed\n * @param Recipient To validate that the recipients that will receive the tokens are allowed\n */\nenum SwapSafeguardMode {\n None,\n SourceChain,\n DestinationChain,\n TokenIn,\n TokenOut,\n Recipient\n}\n\n/**\n * @title SwapOperationsValidator\n * @dev Performs swap operations validations based on safeguards\n */\ncontract SwapOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a swap operation is valid for a safeguard\n * @param operation Swap operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isSwapOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n if (safeguard.mode == uint8(SwapSafeguardMode.SourceChain))\n return _isChainAllowed(swapOperation.sourceChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.DestinationChain))\n return _isChainAllowed(swapOperation.destinationChain, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenIn))\n return _areSwapTokensInValid(swapOperation.tokensIn, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.TokenOut))\n return _areSwapTokensOutValid(swapOperation.tokensOut, safeguard.config);\n if (safeguard.mode == uint8(SwapSafeguardMode.Recipient))\n return _areSwapRecipientsValid(swapOperation.tokensOut, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens to be sent are allowed\n */\n function _areSwapTokensInValid(TokenIn[] memory tokensIn, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensIn.length; i++) {\n if (!_isAccountAllowed(tokensIn[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the tokens to be received are allowed\n */\n function _areSwapTokensOutValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients to be received are allowed\n */\n function _areSwapRecipientsValid(TokenOut[] memory tokensOut, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < tokensOut.length; i++) {\n if (!_isAccountAllowed(tokensOut[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/safeguards/TransferOperationsValidator.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport './BaseOperationsValidator.sol';\nimport './Safeguards.sol';\nimport '../Intents.sol';\n\n/**\n * @dev Transfer safeguard modes to validate transfer operations\n * @param None To ensure no transfers are allowed\n * @param Chain To validate that the chain where transfers execute is allowed\n * @param Token To validate that the tokens being transferred are allowed\n * @param Recipient To validate that the recipients of the transfers are allowed\n */\nenum TransferSafeguardMode {\n None,\n Chain,\n Token,\n Recipient\n}\n\n/**\n * @title TransferOperationsValidator\n * @dev Performs transfer operations validations based on safeguards\n */\ncontract TransferOperationsValidator is BaseOperationsValidator {\n /**\n * @dev Tells whether a transfer operation is valid for a safeguard\n * @param operation Transfer operation to be validated\n * @param safeguard Safeguard to validate the operation with\n */\n function _isTransferOperationValid(Operation memory operation, Safeguard memory safeguard)\n internal\n pure\n returns (bool)\n {\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n if (safeguard.mode == uint8(TransferSafeguardMode.Chain))\n return _isChainAllowed(transferOperation.chainId, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Token))\n return _areTransferTokensValid(transferOperation.transfers, safeguard.config);\n if (safeguard.mode == uint8(TransferSafeguardMode.Recipient))\n return _areTransferRecipientsValid(transferOperation.transfers, safeguard.config);\n revert OperationsValidatorInvalidSafeguardMode(safeguard.mode);\n }\n\n /**\n * @dev Tells whether the tokens being transferred are allowed\n */\n function _areTransferTokensValid(TransferData[] memory transfers, bytes memory config) private pure returns (bool) {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].token, config)) return false;\n }\n return true;\n }\n\n /**\n * @dev Tells whether the recipients of the transfers are allowed\n */\n function _areTransferRecipientsValid(TransferData[] memory transfers, bytes memory config)\n private\n pure\n returns (bool)\n {\n for (uint256 i = 0; i < transfers.length; i++) {\n if (!_isAccountAllowed(transfers[i].recipient, config)) return false;\n }\n return true;\n }\n}\n"
+ },
+ "project/contracts/Settler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol';\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\n\nimport './Intents.sol';\nimport './interfaces/IController.sol';\nimport './interfaces/IDynamicCallEncoder.sol';\nimport './interfaces/IOperationsValidator.sol';\nimport './interfaces/IExecutor.sol';\nimport './interfaces/ISettler.sol';\nimport './utils/Denominations.sol';\nimport './utils/ERC20Helpers.sol';\nimport './smart-accounts/SmartAccountsHandler.sol';\nimport './smart-accounts/SmartAccountsHandlerHelpers.sol';\n\n/**\n * @title Settler\n * @dev Contract that provides the appropriate context for solvers to execute proposals that fulfill user intents\n */\ncontract Settler is ISettler, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, EIP712Upgradeable {\n using SafeERC20 for IERC20;\n using IntentsHelpers for Intent;\n using IntentsHelpers for Proposal;\n using IntentsHelpers for Validation;\n using SmartAccountsHandlerHelpers for address;\n\n // Mimic controller reference\n address public override controller;\n\n // Smart accounts handler reference\n address public override smartAccountsHandler;\n\n // Operations validator reference\n address public override operationsValidator;\n\n // Dynamic call encoder reference\n address public dynamicCallEncoder;\n\n // List of block numbers at which an intent was executed\n mapping (bytes32 => uint256) public override getIntentBlock;\n\n // Safeguard config per user\n mapping (address => bytes) internal _userSafeguard;\n\n /**\n * @dev Modifier to tag settler functions in order to check if the sender is an allowed solver\n */\n modifier onlySolver() {\n address sender = _msgSender();\n if (!IController(controller).isSolverAllowed(sender)) revert SettlerSolverNotAllowed(sender);\n _;\n }\n\n /**\n * @dev Disables initializers to prevent implementation contract from being initialized directly\n */\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @dev Initializes a new Settler contract\n * @param _controller Address of the Settler controller\n * @param _owner Address that will own the contract\n * @param _dynamicCallEncoder Address of the dynamic call encoder\n */\n function initialize(address _controller, address _owner, address _dynamicCallEncoder) external initializer {\n __Ownable_init(_owner);\n __ReentrancyGuard_init();\n __EIP712_init('Mimic Protocol Settler', '1');\n\n controller = _controller;\n smartAccountsHandler = address(new SmartAccountsHandler());\n _setDynamicCallEncoder(_dynamicCallEncoder);\n }\n\n /**\n * @dev Tells the hash of an intent\n * @param intent Intent to get the hash of\n */\n function getIntentHash(Intent memory intent) external pure override returns (bytes32) {\n return intent.hash();\n }\n\n /**\n * @dev Tells the hash of a proposal\n * @param proposal Proposal to be hashed\n * @param intent Intent being fulfilled by the requested proposal\n * @param solver Address of the solver that made the proposal\n */\n function getProposalHash(Proposal memory proposal, Intent memory intent, address solver)\n external\n pure\n override\n returns (bytes32)\n {\n return proposal.hash(intent, solver);\n }\n\n /**\n * @dev Tells the safeguard set for a user\n * @param user Address of the user being queried\n */\n function getUserSafeguard(address user) external view override returns (bytes memory) {\n return _userSafeguard[user];\n }\n\n /**\n * @dev It allows receiving native token transfers\n * Note: This method mainly allows supporting native tokens for swaps\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Withdraws ERC20 or native tokens from the contract\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function rescueFunds(address token, address recipient, uint256 amount) external override onlyOwner nonReentrant {\n if (recipient == address(0)) revert SettlerRescueFundsRecipientZero();\n ERC20Helpers.transfer(token, recipient, amount);\n emit FundsRescued(token, recipient, amount);\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function setSmartAccountsHandler(address newSmartAccountsHandler) external override onlyOwner {\n _setSmartAccountsHandler(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets a new operations validator address\n * @param newOperationsValidator New operations validator to be set\n */\n function setOperationsValidator(address newOperationsValidator) external override onlyOwner {\n _setOperationsValidator(newOperationsValidator);\n }\n\n /**\n * @dev Sets a new dynamic call encoder address\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function setDynamicCallEncoder(address newDynamicCallEncoder) external override onlyOwner {\n _setDynamicCallEncoder(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param safeguard Safeguard to be set\n */\n function setSafeguard(bytes memory safeguard) external override {\n _setSafeguard(msg.sender, safeguard);\n }\n\n /**\n * @dev Executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function execute(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n _execute(intent, proposal, signature, false);\n }\n\n /**\n * @dev Simulates an execution. It will always revert. Successful executions are returned as\n * `SettlerSimulationSuccess` errors. Any other error should be treated as failure.\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n */\n function simulate(Intent memory intent, Proposal memory proposal, bytes memory signature)\n external\n override\n onlySolver\n {\n uint256 initialGas = gasleft();\n _execute(intent, proposal, signature, true);\n uint256 gasUsed = initialGas - gasleft();\n revert SettlerSimulationSuccess(gasUsed);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill an intent\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _execute(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n nonReentrant\n {\n _validateIntent(intent, proposal, signature, simulated);\n getIntentBlock[intent.hash()] = block.number;\n\n bytes[][] memory outputs = new bytes[][](intent.operations.length);\n for (uint256 i = 0; i < intent.operations.length; i++) {\n outputs[i] = _executeOperation(intent, proposal, i, outputs);\n }\n\n _payFees(intent, proposal);\n emit ProposalExecuted(proposal.hash(intent, _msgSender()));\n }\n\n /**\n * @dev Executes proposal to fulfill an operation\n * @param intent Intent being fulfilled\n * @param proposal Proposal being executed\n * @param index Position where the operation and its corresponding proposal data are located\n * @param outputs List of operations outputs\n */\n function _executeOperation(Intent memory intent, Proposal memory proposal, uint256 index, bytes[][] memory outputs)\n internal\n returns (bytes[] memory)\n {\n uint8 opType = intent.operations[index].opType;\n if (opType == uint8(OpType.Swap) || opType == uint8(OpType.CrossChainSwap)) {\n return _executeSwap(intent, proposal, index);\n }\n if (opType == uint8(OpType.Transfer)) return _executeTransfer(intent, proposal, index);\n if (opType == uint8(OpType.Call)) return _executeCall(intent, proposal, index);\n if (opType == uint8(OpType.DynamicCall)) return _executeDynamicCall(intent, proposal, index, outputs);\n revert SettlerUnknownOperationType(opType);\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a swap operation\n * @param intent Intent that contains swap operation to be fulfilled\n * @param proposal Proposal with swap data to be executed\n * @param index Position where the swap proposal data and operation are located\n */\n function _executeSwap(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n SwapOperation memory swapOperation = abi.decode(operation.data, (SwapOperation));\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n if (operation.opType == uint8(OpType.CrossChainSwap)) {\n if (intent.operations.length > 1) revert SettlerCrossChainSwapMustBeOnlyOperation();\n _validateCrossChainSwapOperation(swapOperation, swapProposal);\n } else _validateSingleChainSwapOperation(swapOperation, swapProposal);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n if (swapOperation.sourceChain == block.chainid) {\n for (uint256 i = 0; i < swapOperation.tokensIn.length; i++) {\n TokenIn memory tokenIn = swapOperation.tokensIn[i];\n _transferFrom(tokenIn.token, operation.user, swapProposal.executor, tokenIn.amount, isSmartAccount);\n }\n }\n\n uint256[] memory preBalancesOut = _getTokensOutBalance(swapOperation);\n IExecutor(swapProposal.executor).execute(intent, proposal, index);\n\n outputs = new bytes[](swapOperation.tokensOut.length);\n if (swapOperation.destinationChain == block.chainid) {\n uint256[] memory amounts = new uint256[](swapOperation.tokensOut.length);\n for (uint256 i = 0; i < swapOperation.tokensOut.length; i++) {\n TokenOut memory tokenOut = swapOperation.tokensOut[i];\n uint256 postBalanceOut = ERC20Helpers.balanceOf(tokenOut.token, address(this));\n uint256 preBalanceOut = preBalancesOut[i];\n if (postBalanceOut < preBalanceOut) revert SettlerPostBalanceOutLtPre(i, postBalanceOut, preBalanceOut);\n\n amounts[i] = postBalanceOut - preBalanceOut;\n uint256 proposedAmount = swapProposal.amountsOut[i];\n if (amounts[i] < proposedAmount) revert SettlerAmountOutLtProposed(i, amounts[i], proposedAmount);\n\n ERC20Helpers.transfer(tokenOut.token, tokenOut.recipient, amounts[i]);\n outputs[i] = abi.encode(amounts[i]);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(amounts));\n }\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a transfer operation\n * @param intent Intent that contains transfer operation to be fulfilled\n * @param proposal Transfer proposal to be executed\n * @param index Position where the transfer proposal data and operation are located\n */\n function _executeTransfer(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n TransferOperation memory transferOperation = abi.decode(operation.data, (TransferOperation));\n _validateTransferOperation(transferOperation, proposal.datas[index]);\n\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(operation.user);\n for (uint256 i = 0; i < transferOperation.transfers.length; i++) {\n TransferData memory transfer = transferOperation.transfers[i];\n _transferFrom(transfer.token, operation.user, transfer.recipient, transfer.amount, isSmartAccount);\n }\n\n outputs = new bytes[](0);\n _emitOperationEvents(operation, proposal, intent.hash(), index, new bytes(0));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a call operation\n * @param intent Intent that contains call operation to be fulfilled\n * @param proposal Call proposal to be executed\n * @param index Position where the call proposal data and operation are located\n */\n function _executeCall(Intent memory intent, Proposal memory proposal, uint256 index)\n internal\n returns (bytes[] memory outputs)\n {\n Operation memory operation = intent.operations[index];\n CallOperation memory callOperation = abi.decode(operation.data, (CallOperation));\n _validateCallOperation(callOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](callOperation.calls.length);\n for (uint256 i = 0; i < callOperation.calls.length; i++) {\n CallData memory call = callOperation.calls[i];\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, call.target, call.data, call.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates and executes a proposal to fulfill a dynamic call operation\n * @param intent Intent that contains dynamic call operation to be fulfilled\n * @param proposal Dynamic call proposal to be executed\n * @param index Position where the dynamic call proposal data and operation are located\n * @param variables List of operations outputs\n */\n function _executeDynamicCall(\n Intent memory intent,\n Proposal memory proposal,\n uint256 index,\n bytes[][] memory variables\n ) internal returns (bytes[] memory outputs) {\n Operation memory operation = intent.operations[index];\n DynamicCallOperation memory dynamicCallOperation = abi.decode(operation.data, (DynamicCallOperation));\n _validateDynamicCallOperation(dynamicCallOperation, proposal.datas[index], operation.user);\n\n outputs = new bytes[](dynamicCallOperation.calls.length);\n for (uint256 i = 0; i < dynamicCallOperation.calls.length; i++) {\n DynamicCall memory dynamicCall = abi.decode(dynamicCallOperation.calls[i], (DynamicCall));\n bytes memory data = IDynamicCallEncoder(dynamicCallEncoder).encode(dynamicCall, variables, index);\n // solhint-disable-next-line avoid-low-level-calls\n outputs[i] = smartAccountsHandler.call(operation.user, dynamicCall.target, data, dynamicCall.value);\n }\n\n _emitOperationEvents(operation, proposal, intent.hash(), index, abi.encode(outputs));\n }\n\n /**\n * @dev Validates an intent and its corresponding proposal\n The off-chain validators are assuring that:\n - The trigger signer has authorization over the intent.feePayer and each operations[i].user\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n * @param signature Proposal signature\n * @param simulated Whether the execution is a simulation\n */\n function _validateIntent(Intent memory intent, Proposal memory proposal, bytes memory signature, bool simulated)\n internal\n view\n {\n if (intent.settler != address(this)) revert SettlerInvalidSettler(intent.settler);\n if (intent.nonce == bytes32(0)) revert SettlerNonceZero();\n bytes32 intentHash = intent.hash();\n if (getIntentBlock[intentHash] != 0) revert SettlerIntentAlreadyExecuted(intentHash);\n\n if (intent.operations.length == 0) revert SettlerIntentOperationsEmpty();\n if (intent.operations.length != proposal.datas.length) revert SettlerProposalDataInvalidLength();\n\n if (operationsValidator != address(0)) {\n for (uint256 i = 0; i < intent.operations.length; i++) {\n Operation memory operation = intent.operations[i];\n bytes memory safeguard = _userSafeguard[operation.user];\n if (safeguard.length > 0) IOperationsValidator(operationsValidator).validate(operation, safeguard);\n }\n }\n\n bool shouldValidateDeadlines = _shouldValidateDeadlines(intent);\n if (shouldValidateDeadlines) {\n if (intent.deadline <= block.timestamp) revert SettlerIntentPastDeadline(intent.deadline, block.timestamp);\n bool isProposalPastDeadline = proposal.deadline <= block.timestamp;\n if (isProposalPastDeadline) revert SettlerProposalPastDeadline(proposal.deadline, block.timestamp);\n }\n\n if (intent.maxFees.length != proposal.fees.length) revert SettlerSolverFeeInvalidLength();\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n uint256 maxFee = intent.maxFees[i].amount;\n uint256 proposalFee = proposal.fees[i];\n if (proposalFee > maxFee) revert SettlerSolverFeeTooHigh(proposalFee, maxFee);\n }\n\n uint8 minValidations = IController(controller).minValidations();\n uint256 requiredValidations = intent.minValidations > minValidations ? intent.minValidations : minValidations;\n\n if (intent.validations.length < requiredValidations) {\n revert SettlerIntentValidationsNotEnough(requiredValidations, intent.validations.length);\n }\n\n address lastValidator = address(0);\n Validation memory validation = Validation(intentHash);\n bytes32 typedDataHash = _hashTypedDataV4(validation.hash());\n for (uint256 i = 0; i < intent.validations.length; i++) {\n address validator = ECDSA.recover(typedDataHash, intent.validations[i]);\n if (validator <= lastValidator) {\n revert SettlerValidatorDuplicatedOrUnsorted(lastValidator, validator);\n }\n lastValidator = validator;\n bool isValidatorNotAllowed = !IController(controller).isValidatorAllowed(validator);\n if (isValidatorNotAllowed) revert SettlerValidatorNotAllowed(validator);\n }\n\n address signer = ECDSA.recover(_hashTypedDataV4(proposal.hash(intent, _msgSender())), signature);\n bool isProposalSignerNotAllowed = !IController(controller).isProposalSignerAllowed(signer) && !simulated;\n if (isProposalSignerNotAllowed) revert SettlerProposalSignerNotAllowed(signer);\n }\n\n /**\n * @dev Validates a swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSwapOperation(SwapOperation memory operation, SwapProposal memory proposal) internal view {\n if (proposal.amountsOut.length != operation.tokensOut.length) revert SettlerInvalidProposedAmounts();\n\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n TokenOut memory tokenOut = operation.tokensOut[i];\n address recipient = tokenOut.recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n\n uint256 minAmount = tokenOut.minAmount;\n uint256 proposedAmount = proposal.amountsOut[i];\n if (proposedAmount < minAmount) revert SettlerProposedAmountLtMinAmount(i, proposedAmount, minAmount);\n }\n }\n\n /**\n * @dev Validates a single-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateSingleChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain != operation.destinationChain) revert SettlerOperationChainsMismatch();\n if (operation.sourceChain != block.chainid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n }\n\n /**\n * @dev Validates a transfer operation and its corresponding proposal\n * @param operation Transfer operation to be fulfilled\n * @param proposalData data of the proposal\n */\n function _validateTransferOperation(TransferOperation memory operation, bytes memory proposalData) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n for (uint256 i = 0; i < operation.transfers.length; i++) {\n address recipient = operation.transfers[i].recipient;\n if (recipient == address(this)) revert SettlerInvalidRecipient(recipient);\n }\n }\n\n /**\n * @dev Validates a call operation and its corresponding proposal\n * @param operation Call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateCallOperation(CallOperation memory operation, bytes memory proposalData, address user)\n internal\n view\n {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a dynamic call operation and its corresponding proposal\n * @param operation Dynamic call operation to be fulfilled\n * @param proposalData data of the proposal\n * @param user The originator of the operation\n */\n function _validateDynamicCallOperation(\n DynamicCallOperation memory operation,\n bytes memory proposalData,\n address user\n ) internal view {\n if (operation.chainId != block.chainid) revert SettlerInvalidChain(block.chainid);\n if (proposalData.length > 0) revert SettlerProposalDataNotEmpty();\n if (!smartAccountsHandler.isSmartAccount(user)) revert SettlerUserNotSmartAccount(user);\n }\n\n /**\n * @dev Validates a cross-chain swap operation and its corresponding proposal\n * @param operation Swap operation to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _validateCrossChainSwapOperation(SwapOperation memory operation, SwapProposal memory proposal)\n internal\n view\n {\n if (operation.sourceChain == operation.destinationChain) revert SettlerOperationChainsMismatch();\n bool isChainInvalid = operation.sourceChain != block.chainid && operation.destinationChain != block.chainid;\n if (isChainInvalid) revert SettlerInvalidChain(block.chainid);\n _validateSwapOperation(operation, proposal);\n bool isExecutorInvalid = !IController(controller).isExecutorAllowed(proposal.executor);\n if (isExecutorInvalid) revert SettlerExecutorNotAllowed(proposal.executor);\n }\n\n /**\n * @dev Tells the contract balance for each token out of a swap operation\n * @param operation Swap operation containing the list of tokens out\n */\n function _getTokensOutBalance(SwapOperation memory operation) internal view returns (uint256[] memory balances) {\n balances = new uint256[](operation.tokensOut.length);\n if (operation.destinationChain == block.chainid) {\n for (uint256 i = 0; i < operation.tokensOut.length; i++) {\n balances[i] = ERC20Helpers.balanceOf(operation.tokensOut[i].token, address(this));\n }\n }\n }\n\n /**\n * @dev Tells if the intent and proposal deadlines should be validated\n In the case the intent is being executed on the destination chain of a cross-chain swap, the deadlines are ignored\n * @param intent Intent to be fulfilled\n */\n function _shouldValidateDeadlines(Intent memory intent) internal view returns (bool) {\n // Cross-chain operation can only be the first (and only) operation\n Operation memory operation = intent.operations[0];\n if (operation.opType != uint8(OpType.CrossChainSwap)) return true;\n SwapOperation memory swapIntent = abi.decode(operation.data, (SwapOperation));\n return swapIntent.sourceChain == block.chainid;\n }\n\n /**\n * @dev Emits operation custom events\n * @param operation Operation to emit the custom events for\n * @param proposal Proposal that fulfills the operation\n * @param intentHash Hash of the intent the operation belongs to\n * @param index Position of the operation on operations\n * @param output Encoded array of outputs\n */\n function _emitOperationEvents(\n Operation memory operation,\n Proposal memory proposal,\n bytes32 intentHash,\n uint256 index,\n bytes memory output\n ) internal {\n for (uint256 i = 0; i < operation.events.length; i++) {\n OperationEvent memory operationEvent = operation.events[i];\n emit OperationExecuted(\n operation.user,\n operationEvent.topic,\n uint8(operation.opType),\n operation,\n proposal,\n intentHash,\n index,\n output,\n operationEvent.data\n );\n }\n }\n\n /**\n * @dev Pays fees from the intent feePayer\n * @param intent Intent to be fulfilled\n * @param proposal Proposal to be executed\n */\n function _payFees(Intent memory intent, Proposal memory proposal) internal {\n // A CrossChainSwap only pays fees on destination chain and must be the only operation\n if (intent.operations[0].opType == uint8(OpType.CrossChainSwap)) {\n SwapOperation memory swapOperation = abi.decode(intent.operations[0].data, (SwapOperation));\n if (swapOperation.sourceChain == block.chainid) return;\n }\n address from = intent.feePayer;\n address to = _msgSender();\n bool isSmartAccount = smartAccountsHandler.isSmartAccount(from);\n for (uint256 i = 0; i < intent.maxFees.length; i++) {\n address token = intent.maxFees[i].token;\n if (!Denominations.isUSD(token)) _transferFrom(token, from, to, proposal.fees[i], isSmartAccount);\n }\n }\n\n /**\n * @dev Transfers tokens from one account to another\n * @param token Address of the token to transfer\n * @param from Address of the account sending the tokens\n * @param to Address of the account receiving the tokens\n * @param amount Amount of tokens to transfer\n * @param isSmartAccount Whether the sender is a smart account\n */\n function _transferFrom(address token, address from, address to, uint256 amount, bool isSmartAccount) internal {\n if (isSmartAccount) {\n smartAccountsHandler.transfer(from, token, to, amount);\n } else {\n IERC20(token).safeTransferFrom(from, to, amount);\n }\n }\n\n /**\n * @dev Sets a new smart accounts handler\n * @param newSmartAccountsHandler New smart accounts handler to be set\n */\n function _setSmartAccountsHandler(address newSmartAccountsHandler) internal {\n if (newSmartAccountsHandler == address(0)) revert SmartAccountsHandlerZero();\n smartAccountsHandler = newSmartAccountsHandler;\n emit SmartAccountsHandlerSet(newSmartAccountsHandler);\n }\n\n /**\n * @dev Sets the operations validator\n * @param newOperationsValidator New operations validator to be set\n */\n function _setOperationsValidator(address newOperationsValidator) internal {\n operationsValidator = newOperationsValidator;\n emit OperationsValidatorSet(newOperationsValidator);\n }\n\n /**\n * @dev Sets the dynamic call encoder\n * @param newDynamicCallEncoder New dynamic call encoder to be set\n */\n function _setDynamicCallEncoder(address newDynamicCallEncoder) internal {\n if (newDynamicCallEncoder == address(0)) revert SettlerDynamicCallEncoderZero();\n dynamicCallEncoder = newDynamicCallEncoder;\n emit DynamicCallEncoderSet(newDynamicCallEncoder);\n }\n\n /**\n * @dev Sets a safeguard for a user\n * @param user Address of the user to set the safeguard for\n * @param safeguard Safeguard to be set\n */\n function _setSafeguard(address user, bytes memory safeguard) internal {\n delete _userSafeguard[user];\n _userSafeguard[user] = safeguard;\n emit SafeguardSet(user);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccount7702.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccount7702\n * @dev Provides the smart account logic to use with EIP7702\n */\ncontract SmartAccount7702 is SmartAccountBase {\n // Mimic settler reference\n // solhint-disable-next-line immutable-vars-naming\n address public immutable settler;\n\n /**\n * @dev The sender is not the settler\n */\n error SmartAccount7702SenderNotSettler();\n\n /**\n * @dev Reverts unless the sender is the settler\n */\n modifier onlySettler() {\n if (_msgSender() != settler) revert SmartAccount7702SenderNotSettler();\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount7702 contract\n * @param _settler Address of the Mimic settler\n */\n constructor(address _settler) {\n settler = _settler;\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public override onlySettler {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value) public override onlySettler returns (bytes memory) {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountBase.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/Context.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccount.sol';\nimport '../utils/ERC20Helpers.sol';\n\n/**\n * @title SmartAccountBase\n * @dev Provides the base logic for managing assets and executing arbitrary calls\n */\ncontract SmartAccountBase is ISmartAccount, Context, ERC165, ReentrancyGuard {\n /**\n * @dev Tells whether the contract supports the given interface ID. Overrides ERC165 to declare support for ISmartAccount interface.\n * @param interfaceId Interface ID is defined as the XOR of all function selectors in the interface\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(ISmartAccount).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount) public virtual override nonReentrant {\n ERC20Helpers.transfer(token, recipient, amount);\n emit Transferred(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n virtual\n override\n nonReentrant\n returns (bytes memory result)\n {\n result = Address.functionCallWithValue(target, data, value);\n emit Called(target, data, value, result);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountContract.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\nimport '@openzeppelin/contracts/utils/ReentrancyGuard.sol';\nimport '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';\nimport '@openzeppelin/contracts/utils/introspection/ERC165.sol';\n\nimport '../interfaces/ISmartAccountContract.sol';\nimport './SmartAccountBase.sol';\n\n/**\n * @title SmartAccountContract\n * @dev Provides the smart account logic to use as a standalone contract\n */\ncontract SmartAccountContract is ISmartAccountContract, Ownable, SmartAccountBase {\n // EIP1271 magic return value\n bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\n // EIP1271 invalid signature return value\n bytes4 internal constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n // List of account permissions\n mapping (address => bool) public isSignerAllowed;\n\n // Mimic settler reference\n address public settler;\n\n /**\n * @dev The settler is zero\n */\n error SmartAccountSettlerZero();\n\n /**\n * @dev The input arrays are not of equal length\n */\n error SmartAccountInputInvalidLength();\n\n /**\n * @dev The sender is not the owner or the settler\n */\n error SmartAccountUnauthorizedSender(address sender);\n\n /**\n * @dev Emitted every time the settler is set\n */\n event SettlerSet(address indexed settler);\n\n /**\n * @dev Emitted every time a signer allowance is set\n */\n event SignerAllowedSet(address indexed account, bool allowed);\n\n /**\n * @dev Reverts unless the sender is the owner or the settler\n */\n modifier onlyOwnerOrSettler() {\n address sender = _msgSender();\n bool isAuthorized = sender == owner() || sender == settler;\n if (!isAuthorized) revert SmartAccountUnauthorizedSender(sender);\n _;\n }\n\n /**\n * @dev Creates a new SmartAccount contract\n * @param _settler Address of the Mimic settler\n * @param _owner Address that will own the contract\n */\n constructor(address _settler, address _owner) Ownable(_owner) {\n _setSettler(_settler);\n }\n\n /**\n * @dev Tells whether the signature provided belongs to an allowed account.\n * @param hash Message signed by the account\n * @param signature Signature provided to be verified\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n if (signer != address(0) && (signer == owner() || isSignerAllowed[signer])) return EIP1271_MAGIC_VALUE;\n return EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev It allows receiving native token transfers\n */\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n /**\n * @dev Sets the settler. Sender must be the owner.\n * @param newSettler Address of the new settler to be set\n */\n function setSettler(address newSettler) external onlyOwner {\n _setSettler(newSettler);\n }\n\n /**\n * @dev Sets a list of allowed signers. Sender must be the owner.\n * @param accounts List of account addresses\n * @param allowances List of allowed condition per account\n */\n function setAllowedSigners(address[] memory accounts, bool[] memory allowances) external onlyOwner {\n if (accounts.length != allowances.length) revert SmartAccountInputInvalidLength();\n for (uint256 i = 0; i < accounts.length; i++) {\n address account = accounts[i];\n bool allowed = allowances[i];\n isSignerAllowed[account] = allowed;\n emit SignerAllowedSet(account, allowed);\n }\n }\n\n /**\n * @dev Transfers ERC20 or native tokens to the recipient. Sender must be the owner or the settler.\n * @param token Address of the token to be withdrawn\n * @param recipient Address of the account receiving the tokens\n * @param amount Amount of tokens to be withdrawn\n */\n function transfer(address token, address recipient, uint256 amount)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n {\n super.transfer(token, recipient, amount);\n }\n\n /**\n * @dev Executes an arbitrary call from the contract. Sender must be the owner or the settler.\n * @param target Address where the call will be sent\n * @param data Calldata to be sent to the target\n * @param value Native token value to send along with the call\n * @return result Call response if it was successful, otherwise it reverts\n */\n function call(address target, bytes memory data, uint256 value)\n public\n override(ISmartAccount, SmartAccountBase)\n onlyOwnerOrSettler\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return super.call(target, data, value);\n }\n\n /**\n * @dev Sets the settler\n * @param newSettler Address of the new settler to be set\n */\n function _setSettler(address newSettler) internal {\n if (newSettler == address(0)) revert SmartAccountSettlerZero();\n settler = newSettler;\n emit SettlerSet(newSettler);\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandler.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address account) external view override returns (bool) {\n if (account.code.length == 0) return false;\n if (_isMimicSmartAccount(account)) return true;\n if (_isSafe(account)) return true;\n return false;\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address account, address token, address to, uint256 amount) external override {\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).transfer(token, to, amount);\n if (_isSafe(account)) return _transferSafe(account, token, to, amount);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address account, address target, bytes memory data, uint256 value)\n external\n override\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n if (_isMimicSmartAccount(account)) return ISmartAccount(account).call(target, data, value);\n if (_isSafe(account)) return _callSafe(account, target, data, value);\n revert SmartAccountsHandlerUnsupportedAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a safe\n */\n function _transferSafe(address account, address token, address to, uint256 amount) internal {\n Denominations.isNativeToken(token)\n ? _callSafe(account, to, new bytes(0), amount)\n : _callSafe(account, token, abi.encodeWithSelector(IERC20.transfer.selector, to, amount), 0);\n }\n\n /**\n * @dev Performs a call from a safe\n */\n function _callSafe(address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory)\n {\n (bool success, bytes memory result) = ISafe(account).execTransactionFromModuleReturnData(\n target,\n value,\n data,\n SafeOperation.Call\n );\n return\n data.length == 0\n ? Address.verifyCallResult(success, result)\n : Address.verifyCallResultFromTarget(target, success, result);\n }\n\n /**\n * @dev Tells whether an account is a Mimic smart account\n * @param account Address of the account being queried\n */\n function _isMimicSmartAccount(address account) internal view returns (bool) {\n try ISmartAccount(account).supportsInterface(type(ISmartAccount).interfaceId) returns (bool ok) {\n return ok;\n } catch {\n return false;\n }\n }\n\n /**\n * @dev Tells whether an account is a Gnosis Safe\n * @param account Address of the account being queried\n */\n function _isSafe(address account) internal view returns (bool) {\n try ISafe(account).getThreshold() returns (uint256) {\n return true;\n } catch {\n return false;\n }\n }\n}\n"
+ },
+ "project/contracts/smart-accounts/SmartAccountsHandlerHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport '../interfaces/ISmartAccountsHandler.sol';\n\nlibrary SmartAccountsHandlerHelpers {\n /**\n * @dev Tells whether an account is a supported smart account\n * @param account Address of the account being queried\n */\n function isSmartAccount(address handler, address account) internal view returns (bool) {\n return ISmartAccountsHandler(handler).isSmartAccount(account);\n }\n\n /**\n * @dev Performs a transfer from a smart account\n */\n function transfer(address handler, address account, address token, address to, uint256 amount) internal {\n Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.transfer.selector, account, token, to, amount)\n );\n }\n\n /**\n * @dev Performs a call from a smart account\n */\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n internal\n returns (bytes memory result)\n {\n result = Address.functionDelegateCall(\n handler,\n abi.encodeWithSelector(ISmartAccountsHandler.call.selector, account, target, data, value)\n );\n // Skip the ABI-encoded offset and length of the outer `bytes` to point at the inner payload\n assembly {\n result := add(result, 64)\n }\n }\n}\n"
+ },
+ "project/contracts/test/CallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract CallMock {\n event CallReceived(address indexed sender, uint256 value);\n error CallError();\n\n function call() external payable {\n emit CallReceived(msg.sender, msg.value);\n }\n\n function callError() external payable {\n revert CallError();\n }\n}\n"
+ },
+ "project/contracts/test/dynamic-calls/StaticCallMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract StaticCallMock {\n struct StructMock {\n uint256 a;\n address b;\n }\n\n function returnUint(uint256 value) external pure returns (uint256) {\n return value;\n }\n\n function returnAddress(address value) external payable returns (address) {\n return value;\n }\n\n function returnArray(uint256[] calldata value) external pure returns (uint256[] memory) {\n return value;\n }\n\n function returnFixedArray(uint256[3] calldata value) external pure returns (uint256[3] memory) {\n return value;\n }\n\n function returnStruct(StructMock calldata value) external pure returns (StructMock memory) {\n return value;\n }\n}\n"
+ },
+ "project/contracts/test/executors/EmptyExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\n\ncontract EmptyExecutorMock is IExecutor {\n event Executed();\n\n function execute(Intent memory, Proposal memory, uint256) external override {\n emit Executed();\n }\n}\n"
+ },
+ "project/contracts/test/executors/MintExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../TokenMock.sol';\nimport '../../interfaces/IExecutor.sol';\n\n/* solhint-disable custom-errors */\n\ncontract MintExecutorMock is IExecutor {\n event Minted();\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n TokenMock(tokens[i]).mint(msg.sender, amounts[i]);\n emit Minted();\n }\n }\n}\n"
+ },
+ "project/contracts/test/executors/ReentrantExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../interfaces/ISettler.sol';\n\ncontract ReentrantExecutorMock is IExecutor {\n // solhint-disable-next-line immutable-vars-naming\n address payable public immutable settler;\n\n constructor(address payable _settler) {\n settler = _settler;\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256) external override {\n ISettler(settler).execute(intent, proposal, new bytes(0));\n }\n}\n"
+ },
+ "project/contracts/test/executors/TransferExecutorMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/IExecutor.sol';\nimport '../../utils/ERC20Helpers.sol';\n\n/* solhint-disable custom-errors */\n\ncontract TransferExecutorMock is IExecutor {\n event Transferred();\n\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function execute(Intent memory intent, Proposal memory proposal, uint256 index) external override {\n Operation memory operation = intent.operations[index];\n require(\n operation.opType == uint8(OpType.Swap) || operation.opType == uint8(OpType.CrossChainSwap),\n 'Invalid operation type'\n );\n\n SwapProposal memory swapProposal = abi.decode(proposal.datas[index], (SwapProposal));\n (address[] memory tokens, uint256[] memory amounts) = abi.decode(swapProposal.data, (address[], uint256[]));\n\n require(tokens.length == amounts.length, 'Invalid inputs');\n\n for (uint256 i = 0; i < tokens.length; i++) {\n ERC20Helpers.transfer(tokens[i], msg.sender, amounts[i]);\n emit Transferred();\n }\n }\n}\n"
+ },
+ "project/contracts/test/SettlerV2Mock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../Settler.sol';\n\ncontract SettlerV2Mock is Settler {\n function someNewFunction() external pure returns (string memory) {\n return 'Some new function';\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SafeMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../interfaces/ISafe.sol';\n\ncontract SafeMock is ISafe {\n event ModuleTxExecuted(\n address indexed target,\n bytes data,\n uint256 value,\n SafeOperation operation,\n bool success,\n bytes result\n );\n\n receive() external payable {}\n\n function getThreshold() external pure returns (uint256) {\n return 1;\n }\n\n function execTransactionFromModuleReturnData(address to, uint256 value, bytes memory data, SafeOperation operation)\n external\n returns (bool success, bytes memory result)\n {\n // solhint-disable-next-line avoid-low-level-calls\n (success, result) = to.call{ value: value }(data);\n emit ModuleTxExecuted(to, data, value, operation, success, result);\n }\n}\n"
+ },
+ "project/contracts/test/smart-accounts/SmartAccountsHandlerHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '../../smart-accounts/SmartAccountsHandlerHelpers.sol';\n\ncontract SmartAccountsHandlerHelpersMock {\n using SmartAccountsHandlerHelpers for address;\n\n function call(address handler, address account, address target, bytes memory data, uint256 value)\n external\n returns (bytes memory)\n {\n // solhint-disable-next-line avoid-low-level-calls\n return handler.call(account, target, data, value);\n }\n}\n"
+ },
+ "project/contracts/test/TokenMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/ERC20.sol';\n\ncontract TokenMock is ERC20 {\n uint8 internal _decimals;\n\n constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) {\n _decimals = dec;\n }\n\n function mint(address account, uint256 amount) external {\n _mint(account, amount);\n }\n\n function decimals() public view override returns (uint8) {\n return _decimals;\n }\n}\n"
+ },
+ "project/contracts/test/utils/BytesHelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/BytesHelpers.sol';\n\ncontract BytesHelpersMock {\n using BytesHelpers for bytes;\n\n function readWord0(bytes memory data) external pure returns (uint256) {\n return data.readWord0();\n }\n\n function readWord1(bytes memory data) external pure returns (uint256) {\n return data.readWord1();\n }\n\n function lastWordIsZero(bytes memory data) external pure returns (bool) {\n return data.lastWordIsZero();\n }\n\n function slice(bytes memory data, uint256 start, uint256 end) external pure returns (bytes memory) {\n return data.slice(start, end);\n }\n\n function sliceFrom(bytes memory data, uint256 start) external pure returns (bytes memory) {\n return data.sliceFrom(start);\n }\n}\n"
+ },
+ "project/contracts/test/utils/DenominationsMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/Denominations.sol';\n\n// solhint-disable func-name-mixedcase\n\ncontract DenominationsMock {\n function NATIVE_TOKEN() external pure returns (address) {\n return Denominations.NATIVE_TOKEN;\n }\n\n function USD() external pure returns (address) {\n return Denominations.USD;\n }\n}\n"
+ },
+ "project/contracts/test/utils/ERC20HelpersMock.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '../../utils/ERC20Helpers.sol';\n\ncontract ERC20HelpersMock {\n receive() external payable {\n // solhint-disable-previous-line no-empty-blocks\n }\n\n function approve(address token, address to, uint256 amount) external {\n ERC20Helpers.approve(token, to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) external {\n ERC20Helpers.transfer(token, to, amount);\n }\n\n function balanceOf(address token, address account) external view returns (uint256) {\n return ERC20Helpers.balanceOf(token, account);\n }\n}\n"
+ },
+ "project/contracts/utils/BytesHelpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title BytesHelpers\n * @dev Collection of low-level helpers to operate on `bytes` values in memory.\n */\nlibrary BytesHelpers {\n /**\n * @dev Thrown when a slice operation exceeds the bounds of the input bytes\n */\n error BytesLibSliceOutOfBounds();\n\n /**\n * @dev Reads the first 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result First ABI word of `data`\n */\n function readWord0(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 32))\n }\n }\n\n /**\n * @dev Reads the second 32-byte word of a bytes array\n * @param data Bytes array to read from\n * @return result Second ABI word of `data`\n */\n function readWord1(bytes memory data) internal pure returns (uint256 result) {\n assembly {\n result := mload(add(data, 64))\n }\n }\n\n /**\n * @dev Checks whether the last 32-byte word of a bytes array is zero\n *\n * Commonly used to validate ABI-encoded static values, which must\n * end with a zero padding word.\n */\n function lastWordIsZero(bytes memory data) internal pure returns (bool) {\n bytes32 last;\n assembly {\n last := mload(add(data, mload(data)))\n }\n return last == bytes32(0);\n }\n\n /**\n * @dev Returns a slice of a bytes array from `start` (inclusive) to `end` (exclusive)\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n * @param end Ending byte index (exclusive)\n */\n function slice(bytes memory data, uint256 start, uint256 end) internal pure returns (bytes memory out) {\n if (end < start) revert BytesLibSliceOutOfBounds();\n if (end > data.length) revert BytesLibSliceOutOfBounds();\n\n uint256 len = end - start;\n out = new bytes(len);\n\n assembly {\n let src := add(add(data, 32), start)\n let dst := add(out, 32)\n for {\n let i := 0\n } lt(i, len) {\n i := add(i, 32)\n } {\n mstore(add(dst, i), mload(add(src, i)))\n }\n }\n }\n\n /**\n * @dev Returns a slice of a bytes array starting at `start` until the end\n * @param data Bytes array to slice\n * @param start Starting byte index (inclusive)\n */\n function sliceFrom(bytes memory data, uint256 start) internal pure returns (bytes memory out) {\n return slice(data, start, data.length);\n }\n}\n"
+ },
+ "project/contracts/utils/Denominations.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Denominations\n * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20.\n * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated.\n */\nlibrary Denominations {\n address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217\n address internal constant USD = address(840);\n\n function isUSD(address token) internal pure returns (bool) {\n return token == USD;\n }\n\n function isNativeToken(address token) internal pure returns (bool) {\n return token == NATIVE_TOKEN;\n }\n}\n"
+ },
+ "project/contracts/utils/ERC20Helpers.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\nimport '@openzeppelin/contracts/utils/Address.sol';\n\nimport './Denominations.sol';\n\n/**\n * @title ERC20Helpers\n * @dev Provides a list of ERC20 helper methods\n */\nlibrary ERC20Helpers {\n function approve(address token, address to, uint256 amount) internal {\n SafeERC20.forceApprove(IERC20(token), to, amount);\n }\n\n function transfer(address token, address to, uint256 amount) internal {\n if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount);\n else SafeERC20.safeTransfer(IERC20(token), to, amount);\n }\n\n function balanceOf(address token, address account) internal view returns (uint256) {\n if (Denominations.isNativeToken(token)) return address(account).balance;\n else return IERC20(token).balanceOf(address(account));\n }\n}\n"
+ },
+ "project/contracts/utils/MimicHelper.sol": {
+ "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see .\n\npragma solidity ^0.8.20;\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Custom byte storage per user and key\n mapping (address => mapping (string => bytes)) internal _customStorage;\n\n /**\n * @dev Emitted every time the storage is set\n */\n event StorageSet(address indexed user, string indexed key, bytes indexed data);\n\n /**\n * @dev Tells the native token balance of an address\n * @param target Address to get native token balance\n */\n function getNativeTokenBalance(address target) external view returns (uint256) {\n return target.balance;\n }\n\n /**\n * @dev Tells the code of an address\n * @param target Address to get code\n */\n function getCode(address target) external view returns (bytes memory) {\n return target.code;\n }\n\n /**\n * @dev Tells the data set for the user and the key\n * @param user Address of the user being queried\n * @param key String of the key being queried\n */\n function getStorage(address user, string calldata key) external view returns (bytes memory) {\n return _customStorage[user][key];\n }\n\n /**\n * @dev Sets a data for the user and a key\n * @param key String of the key to set the data for\n * @param data Bytes to be set\n */\n function setStorage(string calldata key, bytes memory data) external {\n _customStorage[msg.sender][key] = data;\n emit StorageSet(msg.sender, key, data);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/deployed_addresses.json b/packages/evm/ignition/deployments/chain-8453/deployed_addresses.json
index 6ee2990..5bb6950 100644
--- a/packages/evm/ignition/deployments/chain-8453/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-8453/deployed_addresses.json
@@ -2,11 +2,15 @@
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3SmartAccount7702#SmartAccount7702": "0x657d65655a263cabc155F1D94507fad9f03d69a3",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
"Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804",
"Create3PaymentsReceiver#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e"
+ "Create3PaymentsReceiver#PaymentsReceiver": "0x88438f46B65a391225d88A445C5551c229bbF85e",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-8453/journal.jsonl b/packages/evm/ignition/deployments/chain-8453/journal.jsonl
index 3d65e0f..a74bf39 100644
--- a/packages/evm/ignition/deployments/chain-8453/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-8453/journal.jsonl
@@ -57,4 +57,42 @@
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","hash":"0xd06a27f08e12cb5cc4d11f71cb8a171510d7a21da2ce442f7d6edf5e8f8536dc","networkInteractionId":1,"receipt":{"blockHash":"0x4cf9b41cae77beb7ca46a51510181da8145db0ed4855bf367781949027c51035","blockNumber":42023265,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":395,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b3281ab55ddb6644b4e085efaa384288a3f65057","0xce432bfcbeb3637715ae91740e95a5a137a347da9e83a966cd47ee68823605f4"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x","logIndex":396,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x88438f46B65a391225d88A445C5551c229bbF85e","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":397,"topics":["0xdc86ea80c17dba36e8aac1a8a9461dcc3967506848bd50e2e48b90507867abb9","0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":398,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000088438f46b65a391225d88a445c5551c229bbf85e"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3PaymentsReceiver#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
{"artifactId":"Create3PaymentsReceiver#ICreateX","dependencies":["Create3PaymentsReceiver#ICreateX.deployCreate3","Create3PaymentsReceiver#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x88438f46B65a391225d88A445C5551c229bbF85e","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xd06a27f08e12cb5cc4d11f71cb8a171510d7a21da2ce442f7d6edf5e8f8536dc","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
+{"artifactId":"Create3PaymentsReceiver#PaymentsReceiver","contractAddress":"0x88438f46B65a391225d88A445C5551c229bbF85e","contractName":"PaymentsReceiver","dependencies":["Create3PaymentsReceiver#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3PaymentsReceiver#PaymentsReceiver","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"futureId":"Create3Settler#Settler","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","type":"WIPE_APPLY"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3DynamicCallEncoder#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302601","0x6080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033"],"artifactId":"Create3DynamicCallEncoder#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3DynamicCallEncoder#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000e376080604052348015600e575f5ffd5b50610e1b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806337c93d4b1461002d575b5f5ffd5b61004061003b366004610baa565b610056565b60405161004d9190610cb6565b60405180910390f35b60608251821115610093576040517f66e32eb400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100a78460400151856060015185856100af565b949350505050565b82516060905f8167ffffffffffffffff8111156100ce576100ce6108aa565b60405190808252806020026020018201604052801561010157816020015b60608152602001906001900390816100ec5790505b5090505f8267ffffffffffffffff81111561011e5761011e6108aa565b604051908082528060200260200182016040528015610147578160200160208202803683370190505b5090505f805b848110156101de575f61017a8a838151811061016b5761016b610ceb565b60200260200101518a8a610316565b9050805f015185838151811061019257610192610ceb565b602002602001018190525080602001518483815181106101b4576101b4610ceb565b9115156020928302919091019091015260408101516101d39084610d13565b92505060010161014d565b50606080825f5b878110156102e0578581815181106101ff576101ff610ceb565b60200260200101511561029a5760405161021f9085908490602001610d3d565b60405160208183030381529060405293508287828151811061024357610243610ceb565b602002602001015160405160200161025c929190610d55565b604051602081830303815290604052925086818151811061027f5761027f610ceb565b602002602001015151826102939190610d13565b91506102d8565b838782815181106102ad576102ad610ceb565b60200260200101516040516020016102c6929190610d55565b60405160208183030381529060405293505b6001016101e5565b508b83836040516020016102f693929190610d69565b604051602081830303815290604052975050505050505050949350505050565b61033a6040518060600160405280606081526020015f151581526020015f81525090565b5f8451600181111561034e5761034e610d9f565b036103675761036084602001516103c9565b90506103c2565b60018451600181111561037c5761037c610d9f565b03610390576103608460200151848461059a565b6040517f51c907b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6103ed6040518060600160405280606081526020015f151581526020015f81525090565b602082516103fb9190610db3565b15610432576040517fdd42b1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61043b826106b4565b1561049f575f61044c8360606106f9565b905080515f03610488576040517f3202a09c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815260016020808301919091526040820152919050565b6040825110156104db576040517f22e16a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104e7836020015190565b90506104f4816020610d13565b83511461052d576040517f0dad520a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825183015115610569576040517ff6fad9ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610584602080865161057c9190610dd2565b869190610710565b8084525f60208501525160408401525050919050565b6105be6040518060600160405280606081526020015f151581526020015f81525090565b83516040146105f9576040517f893ed1c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610605856020015190565b90505f610613866040015190565b905083821061063557604051630310496160e21b815260040160405180910390fd5b84828151811061064757610647610ceb565b602002602001015151811061066f57604051630310496160e21b815260040160405180910390fd5b6106aa85838151811061068457610684610ceb565b6020026020010151828151811061069d5761069d610ceb565b60200260200101516107d7565b9695505050505050565b5f6060825110156106c657505f919050565b602082015160408084015160608501519091831480156106e65750606082145b80156106f0575080155b95945050505050565b606061070783838551610710565b90505b92915050565b606082821015610733576040516319359e9d60e11b815260040160405180910390fd5b8351821115610755576040516319359e9d60e11b815260040160405180910390fd5b5f6107608484610dd2565b90508067ffffffffffffffff81111561077b5761077b6108aa565b6040519080825280601f01601f1916602001820160405280156107a5576020820181803683370190505b509150836020860101602083015f5b838110156107cc5782810151828201526020016107b4565b505050509392505050565b6107fb6040518060600160405280606081526020015f151581526020015f81525090565b602082511015610837576040517f65337a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084082610873565b15610851575f61044c8360206106f9565b61085d825f6020610710565b81525f6020808301919091526040820152919050565b5f60408251101561088557505f919050565b602082516108939190610db3565b1561089f57505f919050565b506020908101511490565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156108e1576108e16108aa565b60405290565b6040516080810167ffffffffffffffff811182821017156108e1576108e16108aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715610933576109336108aa565b604052919050565b5f67ffffffffffffffff821115610954576109546108aa565b5060051b60200190565b5f82601f83011261096d575f5ffd5b813567ffffffffffffffff811115610987576109876108aa565b61099a601f8201601f191660200161090a565b8181528460208386010111156109ae575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126109d9575f5ffd5b81356109ec6109e78261093b565b61090a565b8082825260208201915060208360051b860101925085831115610a0d575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610a30575f5ffd5b86016040818903601f19011215610a45575f5ffd5b610a4d6108be565b602082013560028110610a5e575f5ffd5b8152604082013567ffffffffffffffff811115610a79575f5ffd5b610a888a60208386010161095e565b6020830152508085525050602083019250602081019050610a12565b5095945050505050565b5f82601f830112610abd575f5ffd5b8135610acb6109e78261093b565b8082825260208201915060208360051b860101925085831115610aec575f5ffd5b602085015b83811015610aa457803567ffffffffffffffff811115610b0f575f5ffd5b8601603f81018813610b1f575f5ffd5b6020810135610b306109e78261093b565b808282526020820191506020808460051b8601010192508a831115610b53575f5ffd5b604084015b83811015610b9457803567ffffffffffffffff811115610b76575f5ffd5b610b858d60408884010161095e565b84525060209283019201610b58565b5086525050602093840193919091019050610af1565b5f5f5f60608486031215610bbc575f5ffd5b833567ffffffffffffffff811115610bd2575f5ffd5b840160808187031215610be3575f5ffd5b610beb6108e7565b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f5ffd5b81526020828101359082015260408201357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c4c575f5ffd5b6040820152606082013567ffffffffffffffff811115610c6a575f5ffd5b610c76888285016109ca565b606083015250935050602084013567ffffffffffffffff811115610c98575f5ffd5b610ca486828701610aae565b93969395505050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070a5761070a610cff565b5f81518060208401855e5f93019283525090919050565b5f610d488285610d26565b9283525050602001919050565b5f6100a7610d638386610d26565b84610d26565b7fffffffff00000000000000000000000000000000000000000000000000000000841681525f6106f0610d636004840186610d26565b634e487b7160e01b5f52602160045260245ffd5b5f82610dcd57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111561070a5761070a610cff56fea2646970667358221220df4b9aa537ca4d507e36694bbc5da72ed240d8452cc6f7a2b0c31896d1a3b62064736f6c634300081c0033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":67,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","networkInteractionId":1,"nonce":67,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xf565125282daf799ee801a92ef807996958a29043778a7443e746bd5aab6edf9"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0xf565125282daf799ee801a92ef807996958a29043778a7443e746bd5aab6edf9","networkInteractionId":1,"receipt":{"blockHash":"0xfba34f82774b6d510f8e82891f44cb82d3ad19fa5124702c6c92fb98b280245b","blockNumber":45384689,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":629,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000854bf866d3f6dda8786604428317383e8ae34439","0x1717691abe693063d50160482aff8296d5c08b8f774fd4805bda076ccbd5a858"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":630,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3DynamicCallEncoder#ICreateX","dependencies":["Create3DynamicCallEncoder#ICreateX.deployCreate3","Create3DynamicCallEncoder#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xf565125282daf799ee801a92ef807996958a29043778a7443e746bd5aab6edf9","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0xb3F0F65FA3f94890B7a5Bd17843a6fdfB9407dbD","contractName":"DynamicCallEncoder","dependencies":["Create3DynamicCallEncoder#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3DynamicCallEncoder#DynamicCallEncoder","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c0033"],"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Settler#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Settler#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005e2d6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d57806100d65f395ff3fe60806040526004361061015a575f3560e01c806396d45f51116100bb578063cbc9104511610071578063f2fde38b11610057578063f2fde38b146103d4578063f77c4791146103f3578063faa390d714610411575f5ffd5b8063cbc9104514610396578063e5814ea6146103b5575f5ffd5b80639f86fded116100a15780639f86fded14610339578063a49eacff14610358578063c0c53b8b14610377575f5ffd5b806396d45f51146102fb5780639c2a2c6e1461031a575f5ffd5b806384d44e2811610110578063911929df116100f6578063911929df1461029157806394795916146102bd57806395002651146102dc575f5ffd5b806384d44e281461021c5780638da5cb5b14610255575f5ffd5b80636ccae054116101405780636ccae054146101c2578063715018a6146101e157806384b0196e146101f5575f5ffd5b80630fc27cf6146101655780634987ed2f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004613aa6565b610430565b005b348015610191575f5ffd5b506001546101a5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd575f5ffd5b506101846101dc366004613ac1565b610444565b3480156101ec575f5ffd5b5061018461051a565b348015610200575f5ffd5b5061020961052d565b6040516101b99796959493929190613b67565b348015610227575f5ffd5b50610247610236366004613bf0565b60046020525f908152604090205481565b6040519081526020016101b9565b348015610260575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101a5565b34801561029c575f5ffd5b506102b06102ab366004613aa6565b61062c565b6040516101b99190613c07565b3480156102c8575f5ffd5b506101846102d7366004614271565b6106d5565b3480156102e7575f5ffd5b506102476102f63660046142ff565b6107c1565b348015610306575f5ffd5b50610184610315366004613aa6565b6107d7565b348015610325575f5ffd5b506003546101a5906001600160a01b031681565b348015610344575f5ffd5b50610184610353366004614271565b6107e8565b348015610363575f5ffd5b50610184610372366004613aa6565b610891565b348015610382575f5ffd5b50610184610391366004614377565b6108a2565b3480156103a1575f5ffd5b506101846103b03660046143b4565b610aaf565b3480156103c0575f5ffd5b506002546101a5906001600160a01b031681565b3480156103df575f5ffd5b506101846103ee366004613aa6565b610ab9565b3480156103fe575f5ffd5b505f546101a5906001600160a01b031681565b34801561041c575f5ffd5b5061024761042b3660046143e6565b610b0c565b610438610b1c565b61044181610b90565b50565b61044c610b1c565b610454610c19565b6001600160a01b038216610494576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049f838383610c7c565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805836040516104e491815260200190565b60405180910390a361051560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610522610b1c565b61052b5f610cdb565b565b5f60608082808083817fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100805490915015801561056b57506001810154155b6105d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064015b60405180910390fd5b6105de610d4b565b6105e6610e1e565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009c939b5091995046985030975095509350915050565b6001600160a01b0381165f90815260056020526040902080546060919061065290614418565b80601f016020809104026020016040519081016040528092919081815260200182805461067e90614418565b80156106c95780601f106106a0576101008083540402835291602001916106c9565b820191905f5260205f20905b8154815290600101906020018083116106ac57829003601f168201915b50505050509050919050565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610720573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610744919061444a565b61076c5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b5f5a905061077d8585856001610e6f565b5f5a6107899083614469565b9050806040517fa523ba490000000000000000000000000000000000000000000000000000000081526004016105cd91815260200190565b5f6107cd848484610fa0565b90505b9392505050565b6107df610b1c565b6104418161103d565b5f335f5460405163d9d8edb960e01b81526001600160a01b03808416600483015292935091169063d9d8edb990602401602060405180830381865afa158015610833573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610857919061444a565b61087f5760405163a7ac57a960e01b81526001600160a01b03821660048201526024016105cd565b61088b8484845f610e6f565b50505050565b610899610b1c565b610441816110c6565b5f6108ab61110f565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d75750825b90505f8267ffffffffffffffff1660011480156108f35750303b155b905081158015610901575080155b15610938576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096c57845468ff00000000000000001916680100000000000000001785555b61097587611137565b61097d611148565b6109f16040518060400160405280601681526020017f4d696d69632050726f746f636f6c20536574746c6572000000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611158565b5f80546001600160a01b0319166001600160a01b038a16179055604051610a1790613a30565b604051809103905ff080158015610a30573d5f5f3e3d5ffd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055610a5a8661103d565b8315610aa557845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610441338261116e565b610ac1610b1c565b6001600160a01b038116610b03576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105cd565b61044181610cdb565b5f610b16826111e7565b92915050565b33610b4e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461052b576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105cd565b6001600160a01b038116610bd0576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610c76576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603610caa576105158282611276565b61051583838361131b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614418565b8015610e135780601f10610dea57610100808354040283529160200191610e13565b820191905f5260205f20905b815481529060010190602001808311610df657829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091610d9c90614418565b610e77610c19565b610e838484848461138f565b4360045f610e90876111e7565b81526020019081526020015f20819055505f8461010001515167ffffffffffffffff811115610ec157610ec1613c19565b604051908082528060200260200182016040528015610ef457816020015b6060815260200190600190039081610edf5790505b5090505f5b85610100015151811015610f3857610f1386868385611b85565b828281518110610f2557610f25614488565b6020908102919091010152600101610ef9565b50610f438585611c5c565b610f4e848633610fa0565b6040517f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e0905f90a25061088b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f7fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f610fcb846111e7565b83865f0151610fdd8860200151611d79565b610fea8960400151611e42565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b03811661107d576040517f1793862f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040517facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10905f90a250565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef7905f90a250565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b16565b61113f611e54565b61044181611e92565b611150611e54565b61052b611e9a565b611160611e54565b61116a8282611ea2565b5050565b6001600160a01b0382165f90815260056020526040812061118e91613a3d565b6001600160a01b0382165f9081526005602052604090206111af82826144e0565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea6825f01518360200151846040015185606001516112298760800151611f14565b8760a001518860c001516112418a610100015161202a565b6040516020016112599998979695949392919061459b565b604051602081830303815290604052805190602001209050919050565b804710156112b9576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016105cd565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114611303576040519150601f19603f3d011682016040523d82523d5f602084013e611308565b606091505b50915091508161088b5761088b816120c4565b6040516001600160a01b0383811660248301526044820183905261051591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612106565b60208401516001600160a01b031630146113e65760208401516040517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b6040840151611421576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61142b856111e7565b5f8181526004602052604090205490915015611476576040517f0413dc4a000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b846101000151515f036114b5576040517fe5dfb56a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001515185610100015151146114f9576040517f95784c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546001600160a01b03161561167a575f5b85610100015151811015611678575f866101000151828151811061153257611532614488565b602002602001015190505f60055f83602001516001600160a01b03166001600160a01b031681526020019081526020015f20805461156f90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461159b90614418565b80156115e65780601f106115bd576101008083540402835291602001916115e6565b820191905f5260205f20905b8154815290600101906020018083116115c957829003601f168201915b505050505090505f8151111561166e576002546040517f4007c7140000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690634007c7149061164190859085906004016146b2565b5f6040518083038186803b158015611657575f5ffd5b505afa158015611669573d5f5f3e3d5ffd5b505050505b505060010161150c565b505b5f6116848661218b565b9050801561172357428660600151116116d85760608601516040517f95d3dc2200000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b845142108015906117215785516040517f2c39717b00000000000000000000000000000000000000000000000000000000815260048101919091524260248201526044016105cd565b505b84604001515186608001515114611766576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b866080015151811015611809575f8760800151828151811061178c5761178c614488565b60200260200101516020015190505f876040015183815181106117b1576117b1614488565b60200260200101519050818111156117ff576040517f8ffa61fa00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016105cd565b5050600101611768565b505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561185a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187e91906146d6565b90505f8160ff168860c0015111611898578160ff1661189e565b8760c001515b9050808860e001515110156118f05760e0880151516040517fcd0ce6990000000000000000000000000000000000000000000000000000000081526105cd918391600401918252602082015260400190565b60408051602081019091528481525f908161191261190d836121fd565b61223a565b90505f5b8b60e0015151811015611a85575f61194b838e60e00151848151811061193e5761193e614488565b6020026020010151612281565b9050846001600160a01b0316816001600160a01b0316116119ab576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b038087166004830152821660248201526044016105cd565b5f80546040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b038085166004830152939750879390911690636165567090602401602060405180830381865afa158015611a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a35919061444a565b1590508015611a7b576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b5050600101611916565b505f611a9e611a9861190d8d8f33610fa0565b8b612281565b5f80546040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301529394509192169063163eed9e90602401602060405180830381865afa158015611b02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b26919061444a565b158015611b31575089155b90508015611b76576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105cd565b50505050505050505050505050565b60605f8561010001518481518110611b9f57611b9f614488565b602090810291909101015151905060ff81161580611bc0575060ff81166003145b15611bd857611bd08686866122a9565b915050611c54565b5f1960ff821601611bee57611bd086868661277d565b60011960ff821601611c0557611bd08686866128b2565b60031960ff821601611c1d57611bd086868686612a1f565b6040517f3bb38fe200000000000000000000000000000000000000000000000000000000815260ff821660048201526024016105cd565b949350505050565b600360ff168261010001515f81518110611c7857611c78614488565b60200260200101515f015160ff1603611cd5575f8261010001515f81518110611ca357611ca3614488565b602002602001015160400151806020019051810190611cc291906147a9565b905046815f015103611cd357505050565b505b815160015433905f90611cf1906001600160a01b031684612c1a565b90505f5b856080015151811015611d71575f86608001518281518110611d1957611d19614488565b60200260200101515f01519050611d3a816001600160a01b03166103481490565b611d6857611d6881868689604001518681518110611d5a57611d5a614488565b602002602001015187612c9e565b50600101611cf5565b505050505050565b5f5f825167ffffffffffffffff811115611d9557611d95613c19565b604051908082528060200260200182016040528015611dbe578160200160208202803683370190505b5090505f5b8351811015611e1257838181518110611dde57611dde614488565b602002602001015180519060200120828281518110611dff57611dff614488565b6020908102919091010152600101611dc3565b5080604051602001611e2491906148d9565b60405160208183030381529060405280519060200120915050919050565b5f8160405160200161125991906148d9565b611e5c612cde565b61052b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ac1611e54565b610cb5611e54565b611eaa611e54565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611ef684826144e0565b5060038101611f0583826144e0565b505f8082556001909101555050565b5f5f825167ffffffffffffffff811115611f3057611f30613c19565b604051908082528060200260200182016040528015611f59578160200160208202803683370190505b5090505f5b8351811015611e12577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611f9a57611f9a614488565b60200260200101515f0151858381518110611fb757611fb7614488565b602002602001015160200151604051602001611fef939291909283526001600160a01b03919091166020830152604082015260600190565b6040516020818303038152906040528051906020012082828151811061201757612017614488565b6020908102919091010152600101611f5e565b5f5f825167ffffffffffffffff81111561204657612046613c19565b60405190808252806020026020018201604052801561206f578160200160208202803683370190505b5090505f5b8351811015611e125761209f84828151811061209257612092614488565b6020026020010151612cfc565b8282815181106120b1576120b1614488565b6020908102919091010152600101612074565b8051156120d45780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180612125576040513d5f823e3d81fd5b50505f513d9150811561213c578060011415612149565b6001600160a01b0384163b155b1561088b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b5f5f8261010001515f815181106121a4576121a4614488565b60200260200101519050600360048111156121c1576121c16146f1565b60ff16815f015160ff16146121d95750600192915050565b5f81604001518060200190518101906121f291906147a9565b514614949350505050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001611259565b5f610b16612246612d7a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f61228f8686612d88565b92509250925061229f8282612dd1565b5090949350505050565b60605f84610100015183815181106122c3576122c3614488565b602002602001015190505f81604001518060200190518101906122e691906147a9565b90505f856020015185815181106122ff576122ff614488565b602002602001015180602001905181019061231a919061495b565b9050600360ff16835f015160ff160361237d57600187610100015151111561236e576040517f376fce5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123788282612ed4565b612387565b612387828261300c565b60208301516001545f916123a4916001600160a01b031690612c1a565b905046835f015103612406575f5b836040015151811015612404575f846040015182815181106123d6576123d6614488565b602002602001015190506123fb815f01518760200151865f0151846020015187612c9e565b506001016123b2565b505b5f6124108461305e565b83516040517f0f55ec400000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690630f55ec409061245d908c908c908c90600401614bb3565b5f604051808303815f87803b158015612474575f5ffd5b505af1158015612486573d5f5f3e3d5ffd5b5050505083606001515167ffffffffffffffff8111156124a8576124a8613c19565b6040519080825280602002602001820160405280156124db57816020015b60608152602001906001900390816124c65790505b50955046846020015103612771575f84606001515167ffffffffffffffff81111561250857612508613c19565b604051908082528060200260200182016040528015612531578160200160208202803683370190505b5090505f5b85606001515181101561273a575f8660600151828151811061255a5761255a614488565b602002602001015190505f612572825f01513061311a565b90505f85848151811061258757612587614488565b60200260200101519050808210156125dc576040517ff5ad5ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604481018290526064016105cd565b6125e68183614469565b8585815181106125f8576125f8614488565b6020026020010181815250505f8860400151858151811061261b5761261b614488565b602002602001015190508086868151811061263857612638614488565b602002602001015110156126a6578486868151811061265957612659614488565b60209081029190910101516040517ff0a43aa700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016105cd565b6126d1845f015185604001518888815181106126c4576126c4614488565b6020026020010151610c7c565b8585815181106126e3576126e3614488565b60200260200101516040516020016126fd91815260200190565b6040516020818303038152906040528c868151811061271e5761271e614488565b6020026020010181905250505050508080600101915050612536565b5061276f868a6127498d6111e7565b8b8560405160200161275b9190614ca6565b6040516020818303038152906040526131d8565b505b50505050509392505050565b60605f846101000151838151811061279757612797614488565b602002602001015190505f81604001518060200190518101906127ba9190614cb8565b90506127e381866020015186815181106127d6576127d6614488565b602002602001015161326f565b60208201516001545f91612800916001600160a01b031690612c1a565b90505f5b826020015151811015612857575f8360200151828151811061282857612828614488565b6020026020010151905061284e815f015186602001518360400151846020015187612c9e565b50600101612804565b50604080515f8082526020820190925290612882565b606081526020019060019003908161286d5790505b5093506128a883876128938a6111e7565b604080515f81526020810190915289906131d8565b5050509392505050565b60605f84610100015183815181106128cc576128cc614488565b602002602001015190505f81604001518060200190518101906128ef9190614d44565b905061291d818660200151868151811061290b5761290b614488565b6020026020010151846020015161332c565b80602001515167ffffffffffffffff81111561293b5761293b613c19565b60405190808252806020026020018201604052801561296e57816020015b60608152602001906001900390816129595790505b5092505f5b8160200151518110156129f5575f8260200151828151811061299757612997614488565b6020908102919091018101518582015181519282015160408301516001549395506129cf946001600160a01b039094169391906133c6565b8583815181106129e1576129e1614488565b602090810291909101015250600101612973565b50612a168286612a04896111e7565b878760405160200161275b9190614e8e565b50509392505050565b60605f8561010001518481518110612a3957612a39614488565b602002602001015190505f8160400151806020019051810190612a5c9190614ea0565b9050612a78818760200151878151811061290b5761290b614488565b80602001515167ffffffffffffffff811115612a9657612a96613c19565b604051908082528060200260200182016040528015612ac957816020015b6060815260200190600190039081612ab45790505b5092505f5b816020015151811015612bef575f82602001518281518110612af257612af2614488565b6020026020010151806020019051810190612b0d9190614f80565b6003546040517f37c93d4b0000000000000000000000000000000000000000000000000000000081529192505f916001600160a01b03909116906337c93d4b90612b5f9085908b908d9060040161515f565b5f60405180830381865afa158015612b79573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ba09190810190615257565b602080870151845191850151600154939450612bc8936001600160a01b0316929085906133c6565b868481518110612bda57612bda614488565b60209081029190910101525050600101612ace565b50612c108287612bfe8a6111e7565b888760405160200161275b9190614e8e565b5050949350505050565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa158015612c7a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d0919061444a565b8015612cc257600154612cbd906001600160a01b03168587868661345c565b612cd7565b612cd76001600160a01b0386168585856134b5565b5050505050565b5f612ce761110f565b5468010000000000000000900460ff16919050565b5f7fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3825f01518360200151846040015180519060200120612d4086606001516134ee565b60408051602081019690965260ff909416938501939093526001600160a01b039091166060840152608083015260a082015260c001611259565b5f612d83613602565b905090565b5f5f5f8351604103612dbf576020840151604085015160608601515f1a612db188828585613675565b955095509550505050612dca565b505081515f91506002905b9250925092565b5f826003811115612de457612de46146f1565b03612ded575050565b6001826003811115612e0157612e016146f1565b03612e38576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612e4c57612e4c6146f1565b03612e86576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6003826003811115612e9a57612e9a6146f1565b0361116a576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105cd565b6020820151825103612ef957604051633bc78edf60e01b815260040160405180910390fd5b81515f904614801590612f10575046836020015114155b90508015612f335760405163308a43dd60e11b81524660048201526024016105cd565b612f3d838361373d565b5f805483516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690637d70110290602401602060405180830381865afa158015612f9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc3919061444a565b159050801561088b5782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016105cd565b602082015182511461303157604051633bc78edf60e01b815260040160405180910390fd5b815146146130545760405163308a43dd60e11b81524660048201526024016105cd565b61116a828261373d565b606081606001515167ffffffffffffffff81111561307e5761307e613c19565b6040519080825280602002602001820160405280156130a7578160200160208202803683370190505b50905046826020015103613115575f5b826060015151811015613113576130ee836060015182815181106130dd576130dd614488565b60200260200101515f01513061311a565b82828151811061310057613100614488565b60209081029190910101526001016130b7565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361315057506001600160a01b03811631610b16565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa1580156131ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d19190615289565b9050610b16565b5f5b856060015151811015611d71575f866060015182815181106131fe576131fe614488565b60200260200101519050865f015160ff16815f015188602001516001600160a01b03167fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d38a8a8a8a8a896020015160405161325e969594939291906152a0565b60405180910390a4506001016131da565b815146146132925760405163308a43dd60e11b81524660048201526024016105cd565b8051156132b2576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610515575f836020015182815181106132d8576132d8614488565b6020026020010151604001519050306001600160a01b0316816001600160a01b03160361332357604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b506001016132b4565b8251461461334f5760405163308a43dd60e11b81524660048201526024016105cd565b81511561336f576040516393c58e1160e01b815260040160405180910390fd5b600154613385906001600160a01b031682612c1a565b610515576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016105cd565b606061344f8663ff883fcf60e01b878787876040516024016133eb9493929190615305565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613879565b6040019695505050505050565b6040516001600160a01b03808616602483015280851660448301528316606482015260848101829052611d719086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016133eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261088b9186918216906323b872dd90608401611348565b5f5f825167ffffffffffffffff81111561350a5761350a613c19565b604051908082528060200260200182016040528015613533578160200160208202803683370190505b5090505f5b8351811015611e12577fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df84828151811061357457613574614488565b60200260200101515f015185838151811061359157613591614488565b602002602001015160200151805190602001206040516020016135c7939291909283526020830191909152604082015260600190565b604051602081830303815290604052805190602001208282815181106135ef576135ef614488565b6020908102919091010152600101613538565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61362c6138eb565b613634613966565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156136ae57505f91506003905082613733565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156136ff573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661372a57505f925060019150829050613733565b92505f91508190505b9450945094915050565b81606001515181604001515114613780576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b826060015151811015610515575f836060015182815181106137a6576137a6614488565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b0316036137f557604051630b9ab59960e01b81526001600160a01b03821660048201526024016105cd565b5f826020015190505f8560400151858151811061381457613814614488565b6020026020010151905081811015613869576040517f1fef5f330000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604481018390526064016105cd565b5050600190920191506137829050565b60605f5f846001600160a01b0316846040516138959190615346565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e28583836139bb565b95945050505050565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613916610d4b565b80519091501561392e57805160209091012092915050565b8154801561393d579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10081613991610e1e565b8051909150156139a957805160209091012092915050565b6001820154801561393d579392505050565b6060826139d0576139cb826120c4565b6107d0565b81511580156139e757506001600160a01b0384163b155b15613a29576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105cd565b50806107d0565b6109c58061535d83390190565b508054613a4990614418565b5f825580601f10613a58575050565b601f0160209004905f5260205f209081019061044191905b80821115613a83575f8155600101613a70565b5090565b6001600160a01b0381168114610441575f5ffd5b803561311581613a87565b5f60208284031215613ab6575f5ffd5b81356107d081613a87565b5f5f5f60608486031215613ad3575f5ffd5b8335613ade81613a87565b92506020840135613aee81613a87565b929592945050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b82811015613b5d578151865260209586019590910190600101613b3f565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f613ba160e0830189613aff565b8281036040840152613bb38189613aff565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613be28185613b2d565b9a9950505050505050505050565b5f60208284031215613c00575f5ffd5b5035919050565b602081525f6107d06020830184613aff565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715613c5057613c50613c19565b60405290565b6040516080810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051610120810167ffffffffffffffff81118282101715613c5057613c50613c19565b6040516060810167ffffffffffffffff81118282101715613c5057613c50613c19565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ce957613ce9613c19565b604052919050565b5f67ffffffffffffffff821115613d0a57613d0a613c19565b5060051b60200190565b5f82601f830112613d23575f5ffd5b8135613d36613d3182613cf1565b613cc0565b8082825260208201915060208360061b860101925085831115613d57575f5ffd5b602085015b83811015613da25760408188031215613d73575f5ffd5b613d7b613c2d565b8135613d8681613a87565b8152602082810135818301529084529290920191604001613d5c565b5095945050505050565b5f67ffffffffffffffff821115613dc557613dc5613c19565b50601f01601f191660200190565b5f82601f830112613de2575f5ffd5b8135613df0613d3182613dac565b818152846020838601011115613e04575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613e2f575f5ffd5b8135613e3d613d3182613cf1565b8082825260208201915060208360051b860101925085831115613e5e575f5ffd5b602085015b83811015613da257803567ffffffffffffffff811115613e81575f5ffd5b613e90886020838a0101613dd3565b84525060209283019201613e63565b60ff81168114610441575f5ffd5b5f82601f830112613ebc575f5ffd5b613ec9613d318335613cf1565b82358082526020808301929160051b850101851015613ee6575f5ffd5b602084015b6020853560051b86010181101561408d5767ffffffffffffffff81351115613f11575f5ffd5b803585016080818803601f19011215613f28575f5ffd5b613f30613c56565b613f3d6020830135613e9f565b60208201358152613f516040830135613a87565b6040820135602082015267ffffffffffffffff60608301351115613f73575f5ffd5b613f868860206060850135850101613dd3565b604082015267ffffffffffffffff60808301351115613fa3575f5ffd5b60206080830135830101915087601f830112613fbd575f5ffd5b613fca613d318335613cf1565b82358082526020808301929160051b8501018a811115613fe8575f5ffd5b602085015b818110156140765767ffffffffffffffff8135111561400a575f5ffd5b803586016040818e03601f19011215614021575f5ffd5b614029613c2d565b6020820135815267ffffffffffffffff60408301351115614048575f5ffd5b61405b8e60206040850135850101613dd3565b60208201528086525050602084019350602081019050613fed565b505060608301525084525060209283019201613eeb565b50949350505050565b5f61012082840312156140a7575f5ffd5b6140af613c79565b90506140ba82613a9b565b81526140c860208301613a9b565b60208201526040828101359082015260608083013590820152608082013567ffffffffffffffff8111156140fa575f5ffd5b61410684828501613d14565b60808301525060a082013567ffffffffffffffff811115614125575f5ffd5b61413184828501613dd3565b60a08301525060c0828101359082015260e082013567ffffffffffffffff81111561415a575f5ffd5b61416684828501613e20565b60e08301525061010082013567ffffffffffffffff811115614186575f5ffd5b61419284828501613ead565b6101008301525092915050565b5f606082840312156141af575f5ffd5b6141b7613c9d565b823581529050602082013567ffffffffffffffff8111156141d6575f5ffd5b6141e284828501613e20565b602083015250604082013567ffffffffffffffff811115614201575f5ffd5b8201601f81018413614211575f5ffd5b803561421f613d3182613cf1565b8082825260208201915060208360051b850101925086831115614240575f5ffd5b6020840193505b82841015614262578335825260209384019390910190614247565b60408501525091949350505050565b5f5f5f60608486031215614283575f5ffd5b833567ffffffffffffffff811115614299575f5ffd5b6142a586828701614096565b935050602084013567ffffffffffffffff8111156142c1575f5ffd5b6142cd8682870161419f565b925050604084013567ffffffffffffffff8111156142e9575f5ffd5b6142f586828701613dd3565b9150509250925092565b5f5f5f60608486031215614311575f5ffd5b833567ffffffffffffffff811115614327575f5ffd5b6143338682870161419f565b935050602084013567ffffffffffffffff81111561434f575f5ffd5b61435b86828701614096565b925050604084013561436c81613a87565b809150509250925092565b5f5f5f60608486031215614389575f5ffd5b833561439481613a87565b925060208401356143a481613a87565b9150604084013561436c81613a87565b5f602082840312156143c4575f5ffd5b813567ffffffffffffffff8111156143da575f5ffd5b611c5484828501613dd3565b5f602082840312156143f6575f5ffd5b813567ffffffffffffffff81111561440c575f5ffd5b611c5484828501614096565b600181811c9082168061442c57607f821691505b60208210810361311357634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561445a575f5ffd5b815180151581146107d0575f5ffd5b81810381811115610b1657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f82111561051557805f5260205f20601f840160051c810160208510156144c15750805b601f840160051c820191505b81811015612cd7575f81556001016144cd565b815167ffffffffffffffff8111156144fa576144fa613c19565b61450e816145088454614418565b8461449c565b6020601f821160018114614540575f83156145295750848201515b5f19600385901b1c1916600184901b178455612cd7565b5f84815260208120601f198516915b8281101561456f578785015182556020948501946001909201910161454f565b508482101561458c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8981526001600160a01b03891660208201526001600160a01b03881660408201528660608201528560808201528460a082015261012060c08201525f6145e5610120830186613aff565b60e0830194909452506101000152979650505050505050565b60ff81511682526001600160a01b0360208201511660208301525f6040820151608060408501526146326080850182613aff565b90506060830151848203606086015281815180845260208401915060208160051b8501016020840193505f5b828110156146a657601f1986830301845284518051835260208101519050604060208401526146906040840182613aff565b602096870196959095019492505060010161465e565b50979650505050505050565b604081525f6146c460408301856145fe565b82810360208401526138e28185613aff565b5f602082840312156146e6575f5ffd5b81516107d081613e9f565b634e487b7160e01b5f52602160045260245ffd5b5f614712613d3184613cf1565b8381529050602081016060840283018581111561472d575f5ffd5b835b818110156128a8575f60608289031215614747575f5ffd5b61474f613c9d565b9050815161475c81613a87565b815260208281015190820152604082015161477681613a87565b6040820152835260209092019160600161472f565b5f82601f83011261479a575f5ffd5b6107d083835160208501614705565b5f602082840312156147b9575f5ffd5b815167ffffffffffffffff8111156147cf575f5ffd5b8201608081850312156147e0575f5ffd5b6147e8613c56565b8151815260208083015190820152604082015167ffffffffffffffff81111561480f575f5ffd5b8201601f8101861361481f575f5ffd5b805161482d613d3182613cf1565b8082825260208201915060208360061b85010192508883111561484e575f5ffd5b6020840193505b8284101561489e576040848a03121561486c575f5ffd5b614874613c2d565b845161487f81613a87565b8152602085810151818301529083526040909401939190910190614855565b6040850152505050606082015167ffffffffffffffff8111156148bf575f5ffd5b6148cb8682850161478b565b606083015250949350505050565b81515f90829060208501835b828110156149035781518452602093840193909101906001016148e5565b509195945050505050565b5f82601f83011261491d575f5ffd5b815161492b613d3182613dac565b81815284602083860101111561493f575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561496b575f5ffd5b815167ffffffffffffffff811115614981575f5ffd5b820160608185031215614992575f5ffd5b61499a613c9d565b81516149a581613a87565b8152602082015167ffffffffffffffff8111156149c0575f5ffd5b6149cc8682850161490e565b602083015250604082015167ffffffffffffffff8111156149eb575f5ffd5b80830192505084601f8301126149ff575f5ffd5b8151614a0d613d3182613cf1565b8082825260208201915060208360051b860101925087831115614a2e575f5ffd5b6020850194505b82851015614a50578451825260209485019490910190614a35565b6040840152509095945050505050565b5f8151808452602084019350602083015f5b82811015613b5d57815180516001600160a01b031687526020908101518188015260409096019590910190600101614a72565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614add838351613aff565b6020988901989093509190910190600101614ac1565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852614b378383516145fe565b6020988901989093509190910190600101614b1b565b805182525f602082015160606020850152614b6b6060850182614aa5565b9050604083015184820360408601528181518084526020840191506020830193505f92505b80831015613da25783518252602082019150602084019350600183019250614b90565b60608152614bcd6060820185516001600160a01b03169052565b5f6020850151614be860808401826001600160a01b03169052565b50604085015160a0830152606085015160c0830152608085015161012060e0840152614c18610180840182614a60565b905060a0860151605f1984830301610100850152614c368282613aff565b91505060c086015161012084015260e0860151605f1984830301610140850152614c608282614aa5565b915050610100860151605f1984830301610160850152614c808282614aff565b9150508281036020840152614c958186614b4d565b915050826040830152949350505050565b602081525f6107d06020830184613b2d565b5f60208284031215614cc8575f5ffd5b815167ffffffffffffffff811115614cde575f5ffd5b820160408185031215614cef575f5ffd5b614cf7613c2d565b81518152602082015167ffffffffffffffff811115614d14575f5ffd5b80830192505084601f830112614d28575f5ffd5b614d3785835160208501614705565b6020820152949350505050565b5f60208284031215614d54575f5ffd5b815167ffffffffffffffff811115614d6a575f5ffd5b820160408185031215614d7b575f5ffd5b614d83613c2d565b81518152602082015167ffffffffffffffff811115614da0575f5ffd5b80830192505084601f830112614db4575f5ffd5b8151614dc2613d3182613cf1565b8082825260208201915060208360051b860101925087831115614de3575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614e06575f5ffd5b86016060818b03601f19011215614e1b575f5ffd5b614e23613c9d565b6020820151614e3181613a87565b8152604082015167ffffffffffffffff811115614e4c575f5ffd5b614e5b8c60208386010161490e565b6020838101919091526060939093015160408301525084529283019201614de8565b506020840152509095945050505050565b602081525f6107d06020830184614aa5565b5f60208284031215614eb0575f5ffd5b815167ffffffffffffffff811115614ec6575f5ffd5b820160408185031215614ed7575f5ffd5b614edf613c2d565b81518152602082015167ffffffffffffffff811115614efc575f5ffd5b80830192505084601f830112614f10575f5ffd5b8151614f1e613d3182613cf1565b8082825260208201915060208360051b860101925087831115614f3f575f5ffd5b602085015b83811015614e7d57805167ffffffffffffffff811115614f62575f5ffd5b614f718a6020838a010161490e565b84525060209283019201614f44565b5f60208284031215614f90575f5ffd5b815167ffffffffffffffff811115614fa6575f5ffd5b820160808185031215614fb7575f5ffd5b614fbf613c56565b8151614fca81613a87565b81526020828101519082015260408201517fffffffff0000000000000000000000000000000000000000000000000000000081168114615008575f5ffd5b6040820152606082015167ffffffffffffffff811115615026575f5ffd5b80830192505084601f83011261503a575f5ffd5b8151615048613d3182613cf1565b8082825260208201915060208360051b860101925087831115615069575f5ffd5b602085015b8381101561510057805167ffffffffffffffff81111561508c575f5ffd5b86016040818b03601f190112156150a1575f5ffd5b6150a9613c2d565b6020820151600281106150ba575f5ffd5b8152604082015167ffffffffffffffff8111156150d5575f5ffd5b6150e48c60208386010161490e565b602083015250808552505060208301925060208101905061506e565b506060840152509095945050505050565b5f82825180855260208501945060208160051b830101602085015f5b83811015614af357601f19858403018852615149838351614aa5565b602098890198909350919091019060010161512d565b606081525f60e082016001600160a01b038651166060840152602086015160808401527fffffffff0000000000000000000000000000000000000000000000000000000060408701511660a08401526060860151608060c0850152818151808452610100860191506101008160051b87010193506020830192505f5b818110156152415786850360ff19018352835180516002811061520c57634e487b7160e01b5f52602160045260245ffd5b80875250602081015190506040602087015261522b6040870182613aff565b95505060209384019392909201916001016151db565b505050508281036020840152614c958186615111565b5f60208284031215615267575f5ffd5b815167ffffffffffffffff81111561527d575f5ffd5b611c548482850161490e565b5f60208284031215615299575f5ffd5b5051919050565b60c081525f6152b260c08301896145fe565b82810360208401526152c48189614b4d565b905086604084015285606084015282810360808401526152e48186613aff565b905082810360a08401526152f88185613aff565b9998505050505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6153356080830185613aff565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fe6080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122044a28506e8a4bd162591bec9dca6a9c4cdc2688a8e844ccd7c1807a2f175e12b64736f6c634300081c0033a264697066735822122007db5054d0f94ff85661c26780f4bd9f9150ee4e9e26f8129e41e07b7833781364736f6c634300081c003300000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":68,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":68,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xcdb1003342a20c3d0d76e8376b1d8dc8ac04b7f4895e59717223fa1fe6a24fec"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0xcdb1003342a20c3d0d76e8376b1d8dc8ac04b7f4895e59717223fa1fe6a24fec","networkInteractionId":1,"receipt":{"blockHash":"0xfeb4e6d8da226646ba710b0d83e3d2ff10e693a26c3cc9c3dc85912f5487e515","blockNumber":45384703,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1148,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":1149,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":1150,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Settler#ICreateX","dependencies":["Create3Settler#ICreateX.deployCreate3","Create3Settler#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Settler#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xcdb1003342a20c3d0d76e8376b1d8dc8ac04b7f4895e59717223fa1fe6a24fec","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Settler#Settler","contractAddress":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","contractName":"Settler","dependencies":["Create3Settler#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Settler#Settler","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Proxy#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302603","0x60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd00000000000000000000000000000000000000000000000000000000"],"artifactId":"Create3Proxy#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Proxy#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Proxy#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000105b60a060405234801561000f575f5ffd5b50604051610f5b380380610f5b83398101604081905261002e9161037c565b828282828161003d828261009e565b50508160405161004c90610340565b6001600160a01b039091168152602001604051809103905ff080158015610075573d5f5f3e3d5ffd5b506001600160a01b031660805261009361008e60805190565b6100fc565b505050505050610463565b6100a782610169565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100f0576100eb82826101e7565b505050565b6100f861025a565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61013b5f516020610f3b5f395f51905f52546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101668161027b565b50565b806001600160a01b03163b5f036101a357604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f5f846001600160a01b031684604051610203919061044d565b5f60405180830381855af49150503d805f811461023b576040519150601f19603f3d011682016040523d82523d5f602084013e610240565b606091505b5090925090506102518583836102b8565b95945050505050565b34156102795760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166102a457604051633173bdd160e11b81525f600482015260240161019a565b805f516020610f3b5f395f51905f526101c6565b6060826102cd576102c882610317565b610310565b81511580156102e457506001600160a01b0384163b155b1561030d57604051639996b31560e01b81526001600160a01b038516600482015260240161019a565b50805b9392505050565b8051156103275780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b610587806109b483390190565b80516001600160a01b0381168114610363575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561038e575f5ffd5b6103978461034d565b92506103a56020850161034d565b60408501519092506001600160401b038111156103c0575f5ffd5b8401601f810186136103d0575f5ffd5b80516001600160401b038111156103e9576103e9610368565b604051601f8201601f19908116603f011681016001600160401b038111828210171561041757610417610368565b60405281815282820160200188101561042e575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b5f82518060208501845e5f920191825250919050565b60805161053a61047a5f395f6010015261053a5ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100c4575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100ba576040517fd2b576ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6100c26100cc565b565b6100c26100fa565b5f806100db36600481846103c9565b8101906100e8919061041d565b915091506100f6828261010a565b5050565b6100c2610105610164565b61019b565b610113826101b9565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561015c576101578282610265565b505050565b6100f66102d7565b5f6101967f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f5f375f5f365f845af43d5f5f3e8080156101b5573d5ff35b3d5ffd5b806001600160a01b03163b5f0361020c576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161028191906104ee565b5f60405180830381855af49150503d805f81146102b9576040519150601f19603f3d011682016040523d82523d5f602084013e6102be565b606091505b50915091506102ce85838361030f565b95945050505050565b34156100c2576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103245761031f82610387565b610380565b815115801561033b57506001600160a01b0384163b155b1561037d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610203565b50805b9392505050565b8051156103975780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f858511156103d7575f5ffd5b838611156103e3575f5ffd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561042e575f5ffd5b82356001600160a01b0381168114610444575f5ffd5b9150602083013567ffffffffffffffff81111561045f575f5ffd5b8301601f8101851361046f575f5ffd5b803567ffffffffffffffff811115610489576104896103f0565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156104b8576104b86103f0565b6040528181528282016020018710156104cf575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f82518060208501845e5f92019182525091905056fea264697066735822122033bd4479c8a5c03408c241986083480f65e7ee67a5d9b504b023907ce8de9a7364736f6c634300081c00336080604052348015600e575f5ffd5b50604051610587380380610587833981016040819052602b9160b4565b806001600160a01b038116605857604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b605f816065565b505060df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121560c3575f5ffd5b81516001600160a01b038116811460d8575f5ffd5b9392505050565b61049b806100ec5f395ff3fe608060405260043610610058575f3560e01c80639623609d116100415780639623609d1461009d578063ad3cb1cc146100b0578063f2fde38b14610105575f5ffd5b8063715018a61461005c5780638da5cb5b14610072575b5f5ffd5b348015610067575f5ffd5b50610070610124565b005b34801561007d575f5ffd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b6100706100ab366004610303565b610137565b3480156100bb575f5ffd5b506100f86040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100949190610408565b348015610110575f5ffd5b5061007061011f366004610421565b6101bb565b61012c610216565b6101355f61025b565b565b61013f610216565b6040517f4f1ef2860000000000000000000000000000000000000000000000000000000081526001600160a01b03841690634f1ef286903490610188908690869060040161043c565b5f604051808303818588803b15801561019f575f5ffd5b505af11580156101b1573d5f5f3e3d5ffd5b5050505050505050565b6101c3610216565b6001600160a01b03811661020a576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6102138161025b565b50565b5f546001600160a01b03163314610135576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610201565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610213575f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f60608486031215610315575f5ffd5b8335610320816102c2565b92506020840135610330816102c2565b9150604084013567ffffffffffffffff81111561034b575f5ffd5b8401601f8101861361035b575f5ffd5b803567ffffffffffffffff811115610375576103756102d6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156103a4576103a46102d6565b6040528181528282016020018810156103bb575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61041a60208301846103da565b9392505050565b5f60208284031215610431575f5ffd5b813561041a816102c2565b6001600160a01b0383168152604060208201525f61045d60408301846103da565b94935050505056fea26469706673582212209a05aaf5d7e9015fe6e6e754ccb94354fbff13a0666f53c43bf135d5cee4334164736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd000000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":69,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","networkInteractionId":1,"nonce":69,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xf15a7a86db0ac3e7f289771bd4abd2f2d016a3a42b33f120ddfd21b76563af5d"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0xf15a7a86db0ac3e7f289771bd4abd2f2d016a3a42b33f120ddfd21b76563af5d","networkInteractionId":1,"receipt":{"blockHash":"0xd317c0b1cd8ebf601168b39439f3e0a8e18dcaf89b378574cfe3e291ecb61473","blockNumber":45384713,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":52,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":53,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":54,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":55,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000b3f0f65fa3f94890b7a5bd17843a6fdfb9407dbd"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":56,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":57,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":58,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":59,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3Proxy#ICreateX","dependencies":["Create3Proxy#ICreateX.deployCreate3","Create3Proxy#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Proxy#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xf15a7a86db0ac3e7f289771bd4abd2f2d016a3a42b33f120ddfd21b76563af5d","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Proxy#Proxy","contractAddress":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","contractName":"Proxy","dependencies":["Create3Proxy#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Proxy#Proxy","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccount7702#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302604","0x60a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"artifactId":"Create3SmartAccount7702#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccount7702#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000096960a0604052348015600e575f5ffd5b50604051610949380380610949833981016040819052602b91603f565b60015f556001600160a01b0316608052606a565b5f60208284031215604e575f5ffd5b81516001600160a01b03811681146063575f5ffd5b9392505050565b6080516108ba61008f5f395f8181609b0152818161018701526101e501526108ba5ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806301ffc9a71461004e5780634ae0004114610076578063ab221a7614610096578063beabacc8146100d5575b5f5ffd5b61006161005c366004610676565b6100ea565b60405190151581526020015b60405180910390f35b6100896100843660046106fd565b610182565b60405161006d91906107f8565b6100bd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b6100e86100e336600461080a565b6101e2565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167ff44bac8900000000000000000000000000000000000000000000000000000000148061017c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146101cd57604051637fd7572d60e01b815260040160405180910390fd5b6101d884848461023b565b90505b9392505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461022b57604051637fd7572d60e01b815260040160405180910390fd5b6102368383836102a0565b505050565b6060610245610309565b61025084848461034a565b9050836001600160a01b03167f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e84848460405161028f93929190610844565b60405180910390a26101db60015f55565b6102a8610309565b6102b38383836103ef565b816001600160a01b0316836001600160a01b03167fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee836040516102f891815260200190565b60405180910390a361023660015f55565b60025f5403610344576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b60608147101561037b5760405163cf47918160e01b8152476004820152602481018390526044015b60405180910390fd5b5f5f856001600160a01b03168486604051610396919061086e565b5f6040518083038185875af1925050503d805f81146103d0576040519150601f19603f3d011682016040523d82523d5f602084013e6103d5565b606091505b50915091506103e5868383610428565b9695505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384160361041d57610236828261049d565b61023683838361052f565b60608261043d57610438826105af565b6101db565b815115801561045457506001600160a01b0384163b155b15610496576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b50806101db565b804710156104c75760405163cf47918160e01b815247600482015260248101829052604401610372565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610511576040519150601f19603f3d011682016040523d82523d5f602084013e610516565b606091505b50915091508161052957610529816105af565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526102369084906105f1565b8051156105bf5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180610610576040513d5f823e3d81fd5b50505f513d91508115610627578060011415610634565b6001600160a01b0384163b155b15610529576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610372565b5f60208284031215610686575f5ffd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146101db575f5ffd5b80356001600160a01b03811681146106cb575f5ffd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f5f6060848603121561070f575f5ffd5b610718846106b5565b9250602084013567ffffffffffffffff811115610733575f5ffd5b8401601f81018613610743575f5ffd5b803567ffffffffffffffff81111561075d5761075d6106d0565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106d0565b6040528181528282016020018810156107a3575f5ffd5b816020840160208301375f9181016020019190915293969395505050506040919091013590565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6101db60208301846107ca565b5f5f5f6060848603121561081c575f5ffd5b610825846106b5565b9250610833602085016106b5565b929592945050506040919091013590565b606081525f61085660608301866107ca565b84602084015282810360408401526103e581856107ca565b5f82518060208501845e5f92019182525091905056fea26469706673582212201a61c32346a63383dcde8ba751ca26c8a7dc705b1b58786d3b331748821767f464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa0000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":70,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","networkInteractionId":1,"nonce":70,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x6b351ee0b5cde48268352ab297d25ac2c60e58f31d546cc6c96a0224213a0f13"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0x6b351ee0b5cde48268352ab297d25ac2c60e58f31d546cc6c96a0224213a0f13","networkInteractionId":1,"receipt":{"blockHash":"0x19256d09fe14b5498e7d3abece80d9d60ca467f82662985ab3e8ca70f4194637","blockNumber":45384725,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":368,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":369,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x00000000000000000000000014ae3c251881d2214e376bfa38dd98a4bd33550c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccount7702#ICreateX","dependencies":["Create3SmartAccount7702#ICreateX.deployCreate3","Create3SmartAccount7702#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x6b351ee0b5cde48268352ab297d25ac2c60e58f31d546cc6c96a0224213a0f13","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccount7702#SmartAccount7702","contractAddress":"0x14AE3C251881d2214E376bfa38dD98A4Bd33550c","contractName":"SmartAccount7702","dependencies":["Create3SmartAccount7702#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccount7702#SmartAccount7702","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
\ No newline at end of file
diff --git a/packages/evm/package.json b/packages/evm/package.json
index 944a9df..fa9e172 100644
--- a/packages/evm/package.json
+++ b/packages/evm/package.json
@@ -14,10 +14,11 @@
"test": "hardhat test"
},
"dependencies": {
- "@openzeppelin/contracts": "5.3.0"
+ "@openzeppelin/contracts": "5.3.0",
+ "@openzeppelin/contracts-upgradeable": "5.3.0"
},
"devDependencies": {
- "@mimicprotocol/sdk": "0.0.1-rc.20",
+ "@mimicprotocol/sdk": "~0.1.0",
"@nomicfoundation/hardhat-ethers": "^4.0.0-next.23",
"@nomicfoundation/hardhat-ethers-chai-matchers": "^3.0.0-next.23",
"@nomicfoundation/hardhat-ignition": "^3.0.0-next.23",
diff --git a/packages/evm/scripts/deploy-contracts.ts b/packages/evm/scripts/deploy-contracts.ts
index 438a5a2..c8ab828 100644
--- a/packages/evm/scripts/deploy-contracts.ts
+++ b/packages/evm/scripts/deploy-contracts.ts
@@ -1,4 +1,8 @@
+import { Interface } from 'ethers'
+
import ControllerArtifact from '../artifacts/contracts/Controller.sol/Controller.json'
+import DynamicCallEncoderArtifact from '../artifacts/contracts/dynamic-calls/DynamicCallEncoder.sol/DynamicCallEncoder.json'
+import ProxyArtifact from '../artifacts/contracts/proxy/Proxy.sol/Proxy.json'
import SettlerArtifact from '../artifacts/contracts/Settler.sol/Settler.json'
import SmartAccount7702 from '../artifacts/contracts/smart-accounts/SmartAccount7702.sol/SmartAccount7702.json'
import MimicHelperArtifact from '../artifacts/contracts/utils/MimicHelper.sol/MimicHelper.json'
@@ -15,8 +19,22 @@ async function main(): Promise {
const controllerArgs = [ADMIN, [SOLVER], [], [AXIA], [VALIDATOR], MIN_VALIDATORS]
const controller = await deployCreate3(ControllerArtifact, controllerArgs, '0x17')
- const settler = await deployCreate3(SettlerArtifact, [controller.target, ADMIN], '0x18')
- await deployCreate3(SmartAccount7702, [settler.target], '0x19')
+
+ const dynamicCallEncoder = await deployCreate3(DynamicCallEncoderArtifact, [], '0x04302601')
+ const settlerImplementation = await deployCreate3(SettlerArtifact, [], '0x04302602')
+
+ const initializeData = new Interface(SettlerArtifact.abi).encodeFunctionData('initialize', [
+ controller.target,
+ ADMIN,
+ dynamicCallEncoder.target,
+ ])
+ const settlerProxy = await deployCreate3(
+ ProxyArtifact,
+ [settlerImplementation.target, ADMIN, initializeData],
+ '0x04302603'
+ )
+
+ await deployCreate3(SmartAccount7702, [settlerProxy.target], '0x04302604')
await deployCreate3(MimicHelperArtifact, [], '0x42')
}
diff --git a/packages/evm/scripts/upgrade-settler.ts b/packages/evm/scripts/upgrade-settler.ts
new file mode 100644
index 0000000..32970ba
--- /dev/null
+++ b/packages/evm/scripts/upgrade-settler.ts
@@ -0,0 +1,36 @@
+import { HardhatEthers, HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/types'
+import { Contract, getAddress } from 'ethers'
+import { network } from 'hardhat'
+
+import ProxyAdminArtifact from '../artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json'
+import SettlerArtifact from '../artifacts/contracts/Settler.sol/Settler.json'
+import { deployCreate3 } from './deploy-create3'
+
+const ERC1967_ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'
+
+async function main(): Promise {
+ const { ethers } = await network.connect()
+ const [signer] = await ethers.getSigners()
+
+ if (!process.env.SETTLER_PROXY) throw Error('SETTLER_PROXY env variable not provided')
+ const proxy = getAddress(process.env.SETTLER_PROXY)
+
+ const proxyAdmin = await getProxyAdmin(ethers, proxy, signer)
+ const proxyAdminOwner = await proxyAdmin.owner()
+ if (proxyAdminOwner !== signer.address) {
+ throw Error(`Signer ${signer.address} is not the ProxyAdmin owner ${proxyAdminOwner}`)
+ }
+
+ const implementation = await deployCreate3(SettlerArtifact, [], '0x1802')
+ const tx = await proxyAdmin.upgradeAndCall(proxy, implementation.target, '0x')
+ await tx.wait()
+ console.log(`✅ Settler ${proxy} upgraded in tx ${tx.hash}`)
+}
+
+async function getProxyAdmin(ethers: HardhatEthers, proxy: string, signer: HardhatEthersSigner): Promise {
+ const rawAdmin = await ethers.provider.getStorage(proxy, ERC1967_ADMIN_SLOT)
+ const adminAddress = getAddress(`0x${rawAdmin.slice(-40)}`)
+ return ethers.getContractAt(ProxyAdminArtifact.abi, adminAddress, signer)
+}
+
+main().catch(console.error)
diff --git a/packages/evm/test/Settler.test.ts b/packages/evm/test/Settler.test.ts
index 53db08a..76e914a 100644
--- a/packages/evm/test/Settler.test.ts
+++ b/packages/evm/test/Settler.test.ts
@@ -1,13 +1,14 @@
import {
BigNumberish,
- encodeSwapIntent,
fp,
MAX_UINT256,
NATIVE_TOKEN_ADDRESS,
ONES_BYTES32,
+ Operation,
OpType,
randomEvmAddress,
randomHex,
+ randomNumber,
randomSig,
USD_ADDRESS,
ZERO_ADDRESS,
@@ -20,57 +21,76 @@ import { network } from 'hardhat'
import {
Controller,
+ DynamicCallEncoder,
EmptyExecutorMock,
MintExecutorMock,
ReentrantExecutorMock,
Settler,
- SmartAccount,
+ SmartAccountBase as SmartAccount,
TokenMock,
TransferExecutorMock,
} from '../types/ethers-contracts/index.js'
import itBehavesLikeOwnable from './behaviors/Ownable.behavior'
+import itBehavesLikeUpgradeable from './behaviors/Upgradeable.behavior'
import {
Account,
- CallIntent,
+ CallOperation,
CallProposal,
createCallIntent,
+ createCallOperation,
createCallProposal,
+ createCrossChainSwapIntent,
+ createCrossChainSwapOperation,
+ createDynamicCallIntent,
+ createDynamicCallOperation,
+ createDynamicCallProposal,
createIntent,
createProposal,
createSwapIntent,
+ createSwapOperation,
createSwapProposal,
createTransferIntent,
+ createTransferOperation,
createTransferProposal,
currentTimestamp,
+ deployProxy,
+ DynamicCallOperation,
hashIntent,
hashProposal,
Intent,
+ literal,
Proposal,
- shuffle,
signProposal,
- SwapIntent,
+ SwapOperation,
SwapProposal,
toAddress,
toArray,
- TransferIntent,
+ TransferOperation,
TransferProposal,
+ variable,
} from './helpers'
import { addValidations } from './helpers/validations'
const { ethers } = await network.connect()
/* eslint-disable no-secrets/no-secrets */
+/* eslint-disable @typescript-eslint/no-non-null-assertion */
describe('Settler', () => {
- let settler: Settler, controller: Controller
- let user: HardhatEthersSigner, other: HardhatEthersSigner
- let admin: HardhatEthersSigner, owner: HardhatEthersSigner, solver: HardhatEthersSigner
+ let settler: Settler, controller: Controller, dynamicCallEncoder: DynamicCallEncoder
+ let user: HardhatEthersSigner, other: HardhatEthersSigner, solver: HardhatEthersSigner
+ let admin: HardhatEthersSigner, owner: HardhatEthersSigner, proxyOwner: HardhatEthersSigner
beforeEach('deploy settler', async () => {
// eslint-disable-next-line prettier/prettier
- [, admin, owner, user, other, solver] = await ethers.getSigners()
+ [, admin, owner, user, other, solver, proxyOwner] = await ethers.getSigners()
controller = await ethers.deployContract('Controller', [admin, [], [], [], [], 0])
- settler = await ethers.deployContract('Settler', [controller, owner])
+ dynamicCallEncoder = await ethers.deployContract('DynamicCallEncoder', [])
+ settler = await deployProxy(ethers, 'Settler', proxyOwner, [
+ controller.target,
+ owner.address,
+ dynamicCallEncoder.target,
+ ])
})
const balanceOf = (token: TokenMock | string, account: Account) => {
@@ -85,13 +105,40 @@ describe('Settler', () => {
expect(await settler.controller()).to.be.equal(controller)
})
- it('has no intents validator', async () => {
- expect(await settler.intentsValidator()).to.be.equal(ZERO_ADDRESS)
+ it('has no operations validator', async () => {
+ expect(await settler.operationsValidator()).to.be.equal(ZERO_ADDRESS)
})
it('has a smart accounts handler', async () => {
expect(await settler.smartAccountsHandler()).to.not.be.equal(ZERO_ADDRESS)
})
+
+ it('has a dynamic call decoder', async () => {
+ expect(await settler.dynamicCallEncoder()).to.be.equal(dynamicCallEncoder)
+ })
+ })
+
+ describe('upgradeable', () => {
+ beforeEach('set upgradeable context', function () {
+ this.ethers = ethers
+ this.proxy = settler
+ this.proxyOwner = proxyOwner
+ this.other = other
+ this.implementationNameV1 = 'Settler'
+ this.implementationNameV2 = 'SettlerV2Mock'
+ this.initializeArgs = [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS]
+ this.assertUpgrade = async (proxy: Settler) => {
+ const upgraded = await ethers.getContractAt('SettlerV2Mock', proxy)
+ expect(await upgraded.someNewFunction()).to.be.equal('Some new function')
+ expect(await upgraded.owner()).to.be.equal(owner)
+ expect(await upgraded.controller()).to.be.equal(controller)
+ expect(await upgraded.operationsValidator()).to.be.equal(ZERO_ADDRESS)
+ expect(await upgraded.smartAccountsHandler()).to.not.be.equal(ZERO_ADDRESS)
+ expect(await upgraded.dynamicCallEncoder()).to.be.equal(dynamicCallEncoder)
+ }
+ })
+
+ itBehavesLikeUpgradeable()
})
describe('ownable', () => {
@@ -305,7 +352,7 @@ describe('Settler', () => {
})
})
- describe('setIntentsValidator', () => {
+ describe('setOperationsValidator', () => {
const newValidator = randomEvmAddress()
context('when the sender is the owner', () => {
@@ -313,14 +360,62 @@ describe('Settler', () => {
settler = settler.connect(owner)
})
- it('sets the intents validator and emits an event', async () => {
- const tx = await settler.setIntentsValidator(newValidator)
+ it('sets the operations validator and emits an event', async () => {
+ const tx = await settler.setOperationsValidator(newValidator)
- expect((await settler.intentsValidator()).toLowerCase()).to.equal(newValidator)
+ expect((await settler.operationsValidator()).toLowerCase()).to.equal(newValidator)
- const events = await settler.queryFilter(settler.filters.IntentsValidatorSet(), tx.blockNumber)
+ const events = await settler.queryFilter(settler.filters.OperationsValidatorSet(), tx.blockNumber)
expect(events).to.have.lengthOf(1)
- expect(events[0].args.intentsValidator.toLowerCase()).to.equal(newValidator)
+ expect(events[0].args.operationsValidator.toLowerCase()).to.equal(newValidator)
+ })
+ })
+
+ context('when the sender is not the owner', () => {
+ beforeEach('set sender', () => {
+ settler = settler.connect(user)
+ })
+
+ it('reverts', async () => {
+ await expect(settler.setOperationsValidator(newValidator)).to.be.revertedWithCustomError(
+ settler,
+ 'OwnableUnauthorizedAccount'
+ )
+ })
+ })
+ })
+
+ describe('setDynamicCallEncoder', () => {
+ context('when the sender is the owner', () => {
+ beforeEach('set sender', () => {
+ settler = settler.connect(owner)
+ })
+
+ context('when the dynamic call encoder is not zero', () => {
+ let newDynamicCallEncoder: DynamicCallEncoder
+
+ beforeEach('deploy encoder', async () => {
+ newDynamicCallEncoder = await ethers.deployContract('DynamicCallEncoder', [])
+ })
+
+ it('sets the dynamic call encoder and emits an event', async () => {
+ const tx = await settler.setDynamicCallEncoder(newDynamicCallEncoder)
+
+ expect(await settler.dynamicCallEncoder()).to.equal(newDynamicCallEncoder)
+
+ const events = await settler.queryFilter(settler.filters.DynamicCallEncoderSet(), tx.blockNumber)
+ expect(events).to.have.lengthOf(1)
+ expect(events[0].args.dynamicCallEncoder).to.equal(newDynamicCallEncoder)
+ })
+ })
+
+ context('when the dynamic call encoder is zero', () => {
+ it('reverts', async () => {
+ await expect(settler.setDynamicCallEncoder(ZERO_ADDRESS)).to.be.revertedWithCustomError(
+ settler,
+ 'SettlerDynamicCallEncoderZero'
+ )
+ })
})
})
@@ -330,7 +425,7 @@ describe('Settler', () => {
})
it('reverts', async () => {
- await expect(settler.setIntentsValidator(newValidator)).to.be.revertedWithCustomError(
+ await expect(settler.setDynamicCallEncoder(ZERO_ADDRESS)).to.be.revertedWithCustomError(
settler,
'OwnableUnauthorizedAccount'
)
@@ -385,56 +480,26 @@ describe('Settler', () => {
const proposalParams: Partial = {}
const itReverts = (reason: string) => {
- context('when there is one execution', () => {
- it('reverts', async () => {
- const intent = createIntent(intentParams)
- const proposal = createProposal(proposalParams)
-
- await expect(settler.execute([{ intent, proposal, signature: '0x' }])).to.be.revertedWithCustomError(
- settler,
- reason
- )
- })
- })
-
- context('when there are multiple executions', () => {
- it('reverts', async () => {
- const executions = []
-
- const executor = await ethers.deployContract('EmptyExecutorMock')
- for (let i = 0; i < 5; i++) {
- const uniqueIntent = { ...intentParams }
- const intent = createSwapIntent(uniqueIntent)
- const proposal = createSwapProposal({ executor, ...proposalParams })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- executions.push({ intent, proposal, signature })
- }
- await controller.connect(admin).setAllowedProposalSigners([admin], [true])
-
- const intent = createIntent(intentParams)
- const proposal = createProposal(proposalParams)
- executions.push({ intent, proposal, signature: '0x' })
+ it('reverts', async () => {
+ const intent = createIntent(intentParams)
+ const proposal = createProposal(proposalParams)
- const shuffled = shuffle(executions)
- await expect(settler.execute(shuffled)).to.be.revertedWithCustomError(settler, reason)
- })
+ await expect(settler.execute(intent, proposal, '0x')).to.be.revertedWithCustomError(settler, reason)
})
}
const itRevertsUnlessDestinationChain = (reason: string) => {
context('when the intent is a swap', () => {
- beforeEach('set intent type', async () => {
- intentParams.op = OpType.Swap
- })
-
context('when the swap is single-chain', () => {
- beforeEach('set intent data', async () => {
- intentParams.data = encodeSwapIntent({
+ beforeEach('set intent operation', async () => {
+ const operation = createSwapOperation({
+ user: intentParams.feePayer,
sourceChain: 31337,
destinationChain: 31337,
tokensIn: [],
tokensOut: [],
})
+ intentParams.operations = [operation]
})
itReverts(reason)
@@ -442,51 +507,59 @@ describe('Settler', () => {
context('when the swap is cross-chain', () => {
context('when executing on the source chain', () => {
- beforeEach('set intent data', async () => {
- intentParams.data = encodeSwapIntent({
+ beforeEach('set intent operation', async () => {
+ const operation = createCrossChainSwapOperation({
+ user: intentParams.feePayer,
sourceChain: 31337,
destinationChain: 1,
tokensIn: [],
tokensOut: [],
})
+ intentParams.operations = [operation]
})
itReverts(reason)
})
context('when executing on the destination chain', () => {
- beforeEach('set intent data', async () => {
- intentParams.data = encodeSwapIntent({
+ beforeEach('set intent operation', async () => {
+ const operation = createCrossChainSwapOperation({
+ user: intentParams.feePayer,
sourceChain: 1,
destinationChain: 31337,
tokensIn: [],
tokensOut: [],
})
+ intentParams.operations = [operation]
})
it('does not validate the deadline', async () => {
const intent = createIntent(intentParams)
const proposal = createProposal(proposalParams)
- await expect(
- settler.execute([{ intent, proposal, signature: '0x' }])
- ).not.to.be.revertedWithCustomError(settler, reason)
+ await expect(settler.execute(intent, proposal, '0x')).not.to.be.revertedWithCustomError(settler, reason)
})
})
})
})
context('when the intent is a transfer', () => {
- beforeEach('set intent type', async () => {
- intentParams.op = OpType.Transfer
+ beforeEach('set intent operation', async () => {
+ const operation = createTransferOperation({
+ user: intentParams.feePayer,
+ })
+ intentParams.operations = [operation]
})
itReverts(reason)
})
context('when the intent is a call', () => {
- beforeEach('set intent type', async () => {
- intentParams.op = OpType.EvmCall
+ beforeEach('set intent operation', async () => {
+ const operation = createCallOperation({
+ user: intentParams.feePayer,
+ })
+ intentParams.operations = [operation]
})
itReverts(reason)
@@ -501,7 +574,7 @@ describe('Settler', () => {
context('when the settler contract is correct', () => {
beforeEach('set settler', () => {
- intentParams.user = user
+ intentParams.feePayer = user
intentParams.settler = settler
})
@@ -510,379 +583,462 @@ describe('Settler', () => {
intentParams.nonce = randomHex(32)
})
- context('when the nonce has not been used', () => {
- context('when the intent deadline has not been reached', () => {
- beforeEach('set intent deadline', async () => {
- const now = await currentTimestamp()
- intentParams.deadline = now + BigInt(120 * 10)
- })
-
- context('when the proposal deadline has not been reached', () => {
- beforeEach('set proposal deadline', async () => {
- const now = await currentTimestamp()
- proposalParams.deadline = now + BigInt(120 * 10)
- })
-
- context('when the proposal fee length is correct', () => {
- let feeToken: TokenMock
- const feeAmount = fp(0.1)
-
- beforeEach('deploy fee token', async () => {
- feeToken = await ethers.deployContract('TokenMock', ['TKN', 18])
+ context('when the intent hash has not been used', () => {
+ context('when the operations are not empty', () => {
+ context('when the proposal datas length matches the intent operations length', () => {
+ context('when the intent deadline has not been reached', () => {
+ beforeEach('set intent deadline', async () => {
+ const now = await currentTimestamp()
+ intentParams.deadline = now + BigInt(120 * 10)
})
- beforeEach('set intent max fees', async () => {
- intentParams.maxFees = [{ token: feeToken, amount: feeAmount }]
- })
+ context('when the proposal deadline has not been reached', () => {
+ beforeEach('set proposal deadline', async () => {
+ const now = await currentTimestamp()
+ proposalParams.deadline = now + BigInt(120 * 10)
+ })
- beforeEach('mint and approve fee tokens', async () => {
- await feeToken.mint(user, feeAmount)
- const allowance = await feeToken.allowance(user, settler)
- await feeToken.connect(user).approve(settler, allowance + feeAmount)
- })
+ context('when the proposal fee length is correct', () => {
+ let feeToken: TokenMock
+ const feeAmount = fp(0.1)
- context('when the proposal fee is lower than or equal to the intent max fee', () => {
- beforeEach('set proposal fee', async () => {
- proposalParams.fees = [feeAmount]
- })
+ beforeEach('deploy fee token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['TKN', 18])
+ })
- context(
- 'when the intent minimum validations is higher or equal than the controller minimum validations',
- () => {
- const validator1 = Wallet.createRandom()
- const validator2 = Wallet.createRandom()
- beforeEach('set min validations', async () => {
- await controller.connect(admin).setMinValidations(1)
- intentParams.minValidations = 2
- })
+ beforeEach('set intent max fees', async () => {
+ intentParams.maxFees = [{ token: feeToken, amount: feeAmount }]
+ })
+
+ beforeEach('mint and approve fee tokens', async () => {
+ await feeToken.mint(user, feeAmount)
+ const allowance = await feeToken.allowance(user, settler)
+ await feeToken.connect(user).approve(settler, allowance + feeAmount)
+ })
- beforeEach('set intent', async () => {
- const futureIntent = createSwapIntent(intentParams)
- intentParams.op = futureIntent.op
- intentParams.configSig = randomSig()
- intentParams.data = futureIntent.data
- intentParams.events = []
+ context('when the proposal fee is lower than or equal to the intent max fee', () => {
+ beforeEach('set proposal fee', async () => {
+ proposalParams.fees = [feeAmount]
})
- context('when the validations are more or equal than the required validations', () => {
- beforeEach('set intent validations', async () => {
- await addValidations(settler, intentParams, [validator1, validator2])
- })
+ context(
+ 'when the intent minimum validations is higher or equal than the controller minimum validations',
+ () => {
+ const validator1 = Wallet.createRandom()
+ const validator2 = Wallet.createRandom()
+ beforeEach('set min validations', async () => {
+ await controller.connect(admin).setMinValidations(1)
+ intentParams.minValidations = 2
+ })
- context('when the validators are allowed', () => {
- beforeEach('allow validators', async () => {
- await controller
- .connect(admin)
- .setAllowedValidators([validator1.address, validator2.address], [true, true])
+ beforeEach('set intent', async () => {
+ const futureIntent = createSwapIntent(intentParams, { user: intentParams.feePayer })
+ intentParams.triggerSig = randomSig()
+ intentParams.operations = futureIntent.operations
+ intentParams.events = []
})
- context('when the validations are in order', () => {
- beforeEach('set intent validations in order', async () => {
+ context('when the validations are more or equal than the required validations', () => {
+ beforeEach('set intent validations', async () => {
await addValidations(settler, intentParams, [validator1, validator2])
})
- context('when the proposal has been signed properly', () => {
- beforeEach('allow proposal signer', async () => {
- await controller.connect(admin).setAllowedProposalSigners([admin], [true])
+ context('when the validators are allowed', () => {
+ beforeEach('allow validators', async () => {
+ await controller
+ .connect(admin)
+ .setAllowedValidators([validator1.address, validator2.address], [true, true])
})
- context('for swap intents', () => {
- const swapIntentParams: Partial = {}
- const swapProposalParams: Partial = {}
- let tokenIn: TokenMock, tokenOut: TokenMock, executor: MintExecutorMock
-
- const amountIn = fp(1)
- const proposedAmountOut = amountIn - 1n
- const minAmount = proposedAmountOut - 1n
-
- beforeEach('set tokens', async () => {
- tokenIn = await ethers.deployContract('TokenMock', ['IN', 18])
- tokenOut = await ethers.deployContract('TokenMock', ['OUT', 18])
- swapIntentParams.tokensIn = [{ token: tokenIn, amount: amountIn }]
- swapIntentParams.tokensOut = [{ token: tokenOut, recipient: other, minAmount }]
- })
-
- beforeEach('set executor', async () => {
- executor = await ethers.deployContract('MintExecutorMock')
- swapProposalParams.executor = executor
+ context('when the validations are in order', () => {
+ beforeEach('set intent validations in order', async () => {
+ await addValidations(settler, intentParams, [validator1, validator2])
})
- beforeEach('mint and approve tokens', async () => {
- await tokenIn.mint(user, amountIn)
- await tokenIn.connect(user).approve(settler, amountIn)
- })
+ context('when the proposal has been signed properly', () => {
+ beforeEach('allow proposal signer', async () => {
+ await controller.connect(admin).setAllowedProposalSigners([admin], [true])
+ })
- const itReverts = (reason: string) => {
- it('reverts', async () => {
- const intent = createSwapIntent({ ...intentParams, ...swapIntentParams })
- await addValidations(settler, intent, [validator1, validator2])
- const proposal = createSwapProposal({
- ...proposalParams,
- ...swapProposalParams,
+ context('for single chain swap operations', () => {
+ const swapOperationParams: Partial = {}
+ const swapProposalParams: Partial = {}
+ let tokenIn: TokenMock, tokenOut: TokenMock, executor: MintExecutorMock
+
+ const amountIn = fp(1)
+ const proposedAmountOut = amountIn - 1n
+ const minAmount = proposedAmountOut - 1n
+
+ beforeEach('set tokens', async () => {
+ tokenIn = await ethers.deployContract('TokenMock', ['IN', 18])
+ tokenOut = await ethers.deployContract('TokenMock', ['OUT', 18])
+ swapOperationParams.tokensIn = [{ token: tokenIn, amount: amountIn }]
+ swapOperationParams.tokensOut = [
+ { token: tokenOut, recipient: other, minAmount },
+ ]
})
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await expect(
- settler.execute([{ intent, proposal, signature }])
- ).to.be.revertedWithCustomError(settler, reason)
- })
- }
-
- const itValidatesIntentsProperly = (
- sourceChain: number,
- destinationChain: number
- ) => {
- beforeEach('set source and destination chains', () => {
- swapIntentParams.sourceChain = sourceChain
- swapIntentParams.destinationChain = destinationChain
- })
+ beforeEach('set executor', async () => {
+ executor = await ethers.deployContract('MintExecutorMock')
+ swapProposalParams.executor = executor
+ })
- context('when the proposed amounts length is correct', () => {
- beforeEach('set proposed amounts', () => {
- swapProposalParams.amountsOut = [proposedAmountOut]
+ beforeEach('mint and approve tokens', async () => {
+ await tokenIn.mint(user, amountIn)
+ await tokenIn.connect(user).approve(settler, amountIn)
+ swapOperationParams.user = user
})
- context('when no recipient is the settler', () => {
- beforeEach('set recipient', () => {
- toArray(swapIntentParams.tokensOut).forEach((tokenOut) => {
- tokenOut.recipient = other
+ const itReverts = (reason: string) => {
+ it('reverts', async () => {
+ const intent = createSwapIntent(intentParams, swapOperationParams)
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createSwapProposal({
+ ...proposalParams,
+ ...swapProposalParams,
})
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, reason)
+ })
+ }
+
+ const itValidatesIntentsProperly = (
+ sourceChain: number,
+ destinationChain: number
+ ) => {
+ beforeEach('set source and destination chains', () => {
+ swapOperationParams.sourceChain = sourceChain
+ swapOperationParams.destinationChain = destinationChain
})
- context('when the proposal amount is greater than the min amount', () => {
- beforeEach('set proposal amount', () => {
- swapProposalParams.amountsOut = [minAmount + 1n]
+ context('when the proposed amounts length is correct', () => {
+ beforeEach('set proposed amounts', () => {
+ swapProposalParams.amountsOut = [proposedAmountOut]
})
- const itExecutesTheProposalSuccessfully = () => {
- const itExecutesSuccessfully = () => {
- it('executes successfully', async () => {
- const intent = createSwapIntent({
- ...intentParams,
- ...swapIntentParams,
- })
- await addValidations(settler, intent, [validator1, validator2])
- const proposal = createSwapProposal({
- ...proposalParams,
- ...swapProposalParams,
- })
- const signature = await signProposal(
- settler,
- intent,
- solver,
- proposal,
- admin
- )
+ context('when no recipient is the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(swapOperationParams.tokensOut).forEach((tokenOut) => {
+ tokenOut.recipient = other
+ })
+ })
- const tx = await settler.execute([{ intent, proposal, signature }])
+ context('when the proposal amount is greater than the min amount', () => {
+ beforeEach('set proposal amount', () => {
+ swapProposalParams.amountsOut = [minAmount + 1n]
+ })
- const executorEvents = await executor.queryFilter(
- executor.filters.Minted(),
- tx.blockNumber
+ const itExecutesTheProposalSuccessfully = () => {
+ const itExecutesSuccessfully = () => {
+ it('executes successfully', async () => {
+ const intent = createSwapIntent(intentParams, swapOperationParams)
+
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createSwapProposal({
+ ...proposalParams,
+ ...swapProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const executorEvents = await executor.queryFilter(
+ executor.filters.Minted(),
+ tx.blockNumber
+ )
+ expect(executorEvents).to.have.lengthOf(1)
+
+ const settlerEvents = await settler.queryFilter(
+ settler.filters.ProposalExecuted(),
+ tx.blockNumber
+ )
+ expect(settlerEvents).to.have.lengthOf(1)
+
+ const proposalHash = await settler.getProposalHash(
+ proposal,
+ intent,
+ solver
+ )
+ expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ })
+ }
+
+ context(
+ 'when the amount out is greater than the proposal amount',
+ () => {
+ const amountOut = proposedAmountOut + 1n
+
+ beforeEach('set swap proposal data', async () => {
+ swapProposalParams.executorData =
+ AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[tokenOut.target], [amountOut]]
+ )
+ })
+
+ itExecutesSuccessfully()
+ }
)
- expect(executorEvents).to.have.lengthOf(1)
- const settlerEvents = await settler.queryFilter(
- settler.filters.ProposalExecuted(),
- tx.blockNumber
+ context(
+ 'when the amount out is lower than the proposal amount',
+ () => {
+ const amountOut = proposedAmountOut - 1n
+
+ beforeEach('set swap proposal data', async () => {
+ swapProposalParams.executorData =
+ AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[tokenOut.target], [amountOut]]
+ )
+ })
+
+ if (destinationChain == 31337)
+ itReverts('SettlerAmountOutLtProposed')
+ else itExecutesSuccessfully()
+ }
)
- expect(settlerEvents).to.have.lengthOf(1)
+ }
- const proposalHash = await settler.getProposalHash(
- proposal,
- intent,
- solver
- )
- expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ context('when the executor is allowed', () => {
+ beforeEach('allow executor', async () => {
+ await controller
+ .connect(admin)
+ .setAllowedExecutors([executor], [true])
+ })
+
+ itExecutesTheProposalSuccessfully()
})
- }
- context('when the amount out is greater than the proposal amount', () => {
- const amountOut = proposedAmountOut + 1n
+ context('when the executor is not allowed', () => {
+ beforeEach('disallow executor', async () => {
+ await controller
+ .connect(admin)
+ .setAllowedExecutors([executor], [false])
+ })
- beforeEach('set swap proposal data', async () => {
- swapProposalParams.executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[tokenOut.target], [amountOut]]
- )
+ if (sourceChain == destinationChain)
+ itExecutesTheProposalSuccessfully()
+ else itReverts('SettlerExecutorNotAllowed')
})
-
- itExecutesSuccessfully()
})
- context('when the amount out is lower than the proposal amount', () => {
- const amountOut = proposedAmountOut - 1n
-
- beforeEach('set swap proposal data', async () => {
- swapProposalParams.executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[tokenOut.target], [amountOut]]
- )
+ context('when the proposal amount is lower than the min amount', () => {
+ beforeEach('set proposal amount', () => {
+ swapProposalParams.amountsOut = [minAmount - 1n]
})
- if (destinationChain == 31337) itReverts('SettlerAmountOutLtProposed')
- else itExecutesSuccessfully()
- })
- }
-
- context('when the executor is allowed', () => {
- beforeEach('allow executor', async () => {
- await controller.connect(admin).setAllowedExecutors([executor], [true])
+ itReverts('SettlerProposedAmountLtMinAmount')
})
-
- itExecutesTheProposalSuccessfully()
})
- context('when the executor is not allowed', () => {
- beforeEach('disallow executor', async () => {
- await controller.connect(admin).setAllowedExecutors([executor], [false])
+ context('when a recipient is the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(swapOperationParams.tokensOut).forEach((tokenOut) => {
+ tokenOut.recipient = settler
+ })
})
- if (sourceChain == destinationChain) itExecutesTheProposalSuccessfully()
- else itReverts('SettlerExecutorNotAllowed')
+ itReverts('SettlerInvalidRecipient')
})
})
- context('when the proposal amount is lower than the min amount', () => {
- beforeEach('set proposal amount', () => {
- swapProposalParams.amountsOut = [minAmount - 1n]
+ context('when the proposed amounts length is not correct', () => {
+ beforeEach('set proposed amounts', () => {
+ swapProposalParams.amountsOut = [minAmount, minAmount]
})
- itReverts('SettlerProposedAmountLtMinAmount')
+ itReverts('SettlerInvalidProposedAmounts')
})
- })
+ }
- context('when a recipient is the settler', () => {
- beforeEach('set recipient', () => {
- toArray(swapIntentParams.tokensOut).forEach((tokenOut) => {
- tokenOut.recipient = settler
- })
+ context('when both chains are equal', () => {
+ context('when chains are current chain', () => {
+ itValidatesIntentsProperly(31337, 31337)
})
- itReverts('SettlerInvalidRecipient')
- })
- })
+ context('when chains are not current chain', () => {
+ beforeEach('set chains', () => {
+ swapOperationParams.sourceChain = 1
+ swapOperationParams.destinationChain = 1
+ })
- context('when the proposed amounts length is not correct', () => {
- beforeEach('set proposed amounts', () => {
- swapProposalParams.amountsOut = [minAmount, minAmount]
+ itReverts('SettlerInvalidChain')
+ })
})
- itReverts('SettlerInvalidProposedAmounts')
+ context('when both chains are different', () => {
+ beforeEach('set chains', () => {
+ swapOperationParams.sourceChain = 31337
+ swapOperationParams.destinationChain = 1
+ })
+
+ itReverts('SettlerOperationChainsMismatch')
+ })
})
- }
- context('when the source chain is the current chain', () => {
- const sourceChain = 31337
+ context('for transfer operations', () => {
+ const transferOperationParams: Partial = {}
+ const transferProposalParams: Partial = {}
+ let token: TokenMock
- context('when the destination chain is the current chain', () => {
- const destinationChain = 31337
+ const amount = fp(1)
- itValidatesIntentsProperly(sourceChain, destinationChain)
- })
+ beforeEach('set token', async () => {
+ token = await ethers.deployContract('TokenMock', ['TKN', 18])
+ })
- context('when the destination chain is not the current chain', () => {
- const destinationChain = 1
+ beforeEach('set intent params', async () => {
+ transferOperationParams.transfers = [{ token, amount, recipient: other }]
+ })
- itValidatesIntentsProperly(sourceChain, destinationChain)
- })
- })
+ beforeEach('mint and approve tokens', async () => {
+ await token.mint(user, amount)
+ await token.connect(user).approve(settler, amount)
+ transferOperationParams.user = user
+ })
- context('when the source chain is not the current chain', () => {
- const sourceChain = 1
+ const itReverts = (reason: string) => {
+ it('reverts', async () => {
+ const intent = createTransferIntent(intentParams, transferOperationParams)
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createTransferProposal({
+ ...proposalParams,
+ ...transferProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
- context('when the destination chain is the current chain', () => {
- const destinationChain = 31337
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, reason)
+ })
+ }
- itValidatesIntentsProperly(sourceChain, destinationChain)
- })
+ context('when the chain is the current chain', () => {
+ beforeEach('set chain', () => {
+ transferOperationParams.chainId = 31337
+ })
- context('when the destination chain is not the current chain', () => {
- const destinationChain = 1
+ context('when the proposal has some data', () => {
+ beforeEach('set proposal data', () => {
+ proposalParams.datas = ['0xab']
+ })
- beforeEach('set source and destination chains', () => {
- swapIntentParams.sourceChain = sourceChain
- swapIntentParams.destinationChain = destinationChain
- })
+ itReverts('SettlerProposalDataNotEmpty')
+ })
- itReverts('SettlerInvalidChain')
- })
- })
- })
+ context('when the proposal has no data', () => {
+ beforeEach('set proposal data', () => {
+ proposalParams.datas = ['0x']
+ })
- context('for transfer intents', () => {
- const transferIntentParams: Partial = {}
- const transferProposalParams: Partial = {}
- let token: TokenMock
+ context('when the recipient is not the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(transferOperationParams.transfers).forEach((transfer) => {
+ transfer.recipient = other
+ })
+ })
- const amount = fp(1)
+ it('executes successfully', async () => {
+ const intent = createTransferIntent(
+ intentParams,
+ transferOperationParams
+ )
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createTransferProposal({
+ ...proposalParams,
+ ...transferProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const settlerEvents = await settler.queryFilter(
+ settler.filters.ProposalExecuted(),
+ tx.blockNumber
+ )
+ expect(settlerEvents).to.have.lengthOf(1)
+
+ const proposalHash = await settler.getProposalHash(
+ proposal,
+ intent,
+ solver
+ )
+ expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ })
+ })
- beforeEach('set token', async () => {
- token = await ethers.deployContract('TokenMock', ['TKN', 18])
- })
+ context('when a recipient is the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(transferOperationParams.transfers).forEach((transfer) => {
+ transfer.recipient = settler
+ })
+ })
- beforeEach('set intent params', async () => {
- transferIntentParams.transfers = [{ token, amount, recipient: other }]
- })
+ itReverts('SettlerInvalidRecipient')
+ })
+ })
+ })
- beforeEach('mint and approve tokens', async () => {
- await token.mint(user, amount)
- await token.connect(user).approve(settler, amount)
- })
+ context('when the chain is not the current chain', () => {
+ beforeEach('set chain', () => {
+ transferOperationParams.chainId = 1
+ })
- const itReverts = (reason: string) => {
- it('reverts', async () => {
- const intent = createTransferIntent({
- ...intentParams,
- ...transferIntentParams,
+ itReverts('SettlerInvalidChain')
})
- await addValidations(settler, intent, [validator1, validator2])
- const proposal = createTransferProposal({
- ...proposalParams,
- ...transferProposalParams,
- })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
-
- await expect(
- settler.execute([{ intent, proposal, signature }])
- ).to.be.revertedWithCustomError(settler, reason)
})
- }
- context('when the chain is the current chain', () => {
- beforeEach('set chain', () => {
- transferIntentParams.chainId = 31337
- })
+ context('for call operations', () => {
+ const callOperationParams: Partial = {}
+ const callProposalParams: Partial = {}
+ let token: TokenMock
- context('when the proposal has some data', () => {
- beforeEach('set proposal data', () => {
- proposalParams.data = '0xab'
+ beforeEach('set token', async () => {
+ token = await ethers.deployContract('TokenMock', ['TKN', 18])
})
- itReverts('SettlerProposalDataNotEmpty')
- })
+ beforeEach('set intent params', async () => {
+ const target = await ethers.deployContract('CallMock')
+ const data = target.interface.encodeFunctionData('call')
- context('when the proposal has no data', () => {
- beforeEach('set proposal data', () => {
- proposalParams.data = '0x'
+ callOperationParams.calls = [{ target, data, value: 0 }]
})
- context('when the recipient is not the settler', () => {
- beforeEach('set recipient', () => {
- toArray(transferIntentParams.transfers).forEach((transfer) => {
- transfer.recipient = other
- })
- })
-
- it('executes successfully', async () => {
- const intent = createTransferIntent({
- ...intentParams,
- ...transferIntentParams,
- })
+ const itReverts = (reason: string) => {
+ it('reverts', async () => {
+ const intent = createCallIntent(intentParams, callOperationParams)
await addValidations(settler, intent, [validator1, validator2])
- const proposal = createTransferProposal({
+ const proposal = createCallProposal({
...proposalParams,
- ...transferProposalParams,
+ ...callProposalParams,
})
const signature = await signProposal(
settler,
@@ -892,105 +1048,134 @@ describe('Settler', () => {
admin
)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const settlerEvents = await settler.queryFilter(
- settler.filters.ProposalExecuted(),
- tx.blockNumber
- )
- expect(settlerEvents).to.have.lengthOf(1)
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, reason)
+ })
+ }
- const proposalHash = await settler.getProposalHash(proposal, intent, solver)
- expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ context('when the chain is the current chain', () => {
+ beforeEach('set chain', () => {
+ callOperationParams.chainId = 31337
})
- })
- context('when a recipient is the settler', () => {
- beforeEach('set recipient', () => {
- toArray(transferIntentParams.transfers).forEach((transfer) => {
- transfer.recipient = settler
+ context('when the proposal has some data', () => {
+ beforeEach('set proposal data', () => {
+ proposalParams.datas = ['0xab']
})
- })
- itReverts('SettlerInvalidRecipient')
- })
- })
- })
+ itReverts('SettlerProposalDataNotEmpty')
+ })
- context('when the chain is not the current chain', () => {
- beforeEach('set chain', () => {
- transferIntentParams.chainId = 1
- })
+ context('when no data is given', () => {
+ beforeEach('set proposal data', () => {
+ proposalParams.datas = ['0x']
+ })
- itReverts('SettlerInvalidChain')
- })
- })
+ context('when the user is a smart account', () => {
+ beforeEach('set intent user', async () => {
+ const smartAccountUser = await ethers.deployContract(
+ 'SmartAccountContract',
+ [settler, owner]
+ )
+ intentParams.feePayer = smartAccountUser
+ callOperationParams.user = smartAccountUser
+ await feeToken.mint(intentParams.feePayer, feeAmount)
+ })
- context('for call intents', () => {
- const callIntentParams: Partial = {}
- const callProposalParams: Partial = {}
- let token: TokenMock
+ it('executes successfully', async () => {
+ const intent = createCallIntent(intentParams, callOperationParams)
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createCallProposal({
+ ...proposalParams,
+ ...callProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const settlerEvents = await settler.queryFilter(
+ settler.filters.ProposalExecuted(),
+ tx.blockNumber
+ )
+ expect(settlerEvents).to.have.lengthOf(1)
+
+ const proposalHash = await settler.getProposalHash(
+ proposal,
+ intent,
+ solver
+ )
+ expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ })
+ })
- beforeEach('set token', async () => {
- token = await ethers.deployContract('TokenMock', ['TKN', 18])
- })
+ context('when the user is not a smart account', () => {
+ context('when the user is an EOA', () => {
+ beforeEach('set intent user', async () => {
+ intentParams.feePayer = other
+ callOperationParams.user = other
+ })
- beforeEach('set intent params', async () => {
- const target = await ethers.deployContract('CallMock')
- const data = target.interface.encodeFunctionData('call')
+ itReverts('SettlerUserNotSmartAccount')
+ })
- callIntentParams.calls = [{ target, data, value: 0 }]
- })
+ context('when the user is another contract', () => {
+ beforeEach('set intent user', async () => {
+ intentParams.feePayer = token
+ callOperationParams.user = token
+ })
- const itReverts = (reason: string) => {
- it('reverts', async () => {
- const intent = createCallIntent({ ...intentParams, ...callIntentParams })
- await addValidations(settler, intent, [validator1, validator2])
- const proposal = createCallProposal({
- ...proposalParams,
- ...callProposalParams,
+ itReverts('SettlerUserNotSmartAccount')
+ })
+ })
+ })
})
- const signature = await signProposal(settler, intent, solver, proposal, admin)
-
- await expect(
- settler.execute([{ intent, proposal, signature }])
- ).to.be.revertedWithCustomError(settler, reason)
- })
- }
- context('when the chain is the current chain', () => {
- beforeEach('set chain', () => {
- callIntentParams.chainId = 31337
- })
+ context('when the chain is not the current chain', () => {
+ beforeEach('set chain', () => {
+ callOperationParams.chainId = 1
+ })
- context('when the proposal has some data', () => {
- beforeEach('set proposal data', () => {
- proposalParams.data = '0xab'
+ itReverts('SettlerInvalidChain')
})
-
- itReverts('SettlerProposalDataNotEmpty')
})
- context('when no data is given', () => {
- beforeEach('set proposal data', () => {
- proposalParams.data = '0x'
+ context('for dynamic call operations', () => {
+ const dynamicCallOperationParams: Partial = {}
+ const dynamicCallProposalParams: Partial = {}
+ let token: TokenMock
+
+ beforeEach('set token', async () => {
+ token = await ethers.deployContract('TokenMock', ['TKN', 18])
})
- context('when the user is a smart account', () => {
- beforeEach('set intent user', async () => {
- intentParams.user = await ethers.deployContract('SmartAccountContract', [
- settler,
- owner,
- ])
- await feeToken.mint(intentParams.user, feeAmount)
- })
+ beforeEach('set intent params', async () => {
+ const target = await ethers.deployContract('StaticCallMock')
+ dynamicCallOperationParams.calls = [
+ {
+ target,
+ selector: target.interface.getFunction('returnUint')!.selector,
+ arguments: [literal(['uint256'], [11n])],
+ },
+ ]
+ })
- it('executes successfully', async () => {
- const intent = createCallIntent({ ...intentParams, ...callIntentParams })
+ const itReverts = (reason: string) => {
+ it('reverts', async () => {
+ const intent = createDynamicCallIntent(
+ intentParams,
+ dynamicCallOperationParams
+ )
await addValidations(settler, intent, [validator1, validator2])
- const proposal = createCallProposal({
+ const proposal = createDynamicCallProposal({
...proposalParams,
- ...callProposalParams,
+ ...dynamicCallProposalParams,
})
const signature = await signProposal(
settler,
@@ -1000,189 +1185,556 @@ describe('Settler', () => {
admin
)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const settlerEvents = await settler.queryFilter(
- settler.filters.ProposalExecuted(),
- tx.blockNumber
- )
- expect(settlerEvents).to.have.lengthOf(1)
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, reason)
+ })
+ }
- const proposalHash = await settler.getProposalHash(proposal, intent, solver)
- expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ context('when the chain is the current chain', () => {
+ beforeEach('set chain', () => {
+ dynamicCallOperationParams.chainId = 31337
})
- })
- context('when the user is not a smart account', () => {
- context('when the user is an EOA', () => {
- beforeEach('set intent user', async () => {
- intentParams.user = other
+ context('when the proposal has some data', () => {
+ beforeEach('set proposal data', () => {
+ dynamicCallProposalParams.datas = ['0xab']
})
- itReverts('SettlerUserNotSmartAccount')
+ itReverts('SettlerProposalDataNotEmpty')
})
- context('when the user is another contract', () => {
+ context('when the user is a smart account', () => {
+ beforeEach('set proposal data', () => {
+ dynamicCallProposalParams.datas = ['0x']
+ })
+
beforeEach('set intent user', async () => {
- intentParams.user = token
+ const smartAccountUser = await ethers.deployContract(
+ 'SmartAccountContract',
+ [settler, owner]
+ )
+ intentParams.feePayer = smartAccountUser
+ dynamicCallOperationParams.user = smartAccountUser
+ await feeToken.mint(intentParams.feePayer, feeAmount)
})
- itReverts('SettlerUserNotSmartAccount')
+ it('executes successfully', async () => {
+ const intent = createDynamicCallIntent(
+ intentParams,
+ dynamicCallOperationParams
+ )
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createDynamicCallProposal({
+ ...proposalParams,
+ ...dynamicCallProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const settlerEvents = await settler.queryFilter(
+ settler.filters.ProposalExecuted(),
+ tx.blockNumber
+ )
+ expect(settlerEvents).to.have.lengthOf(1)
+
+ const proposalHash = await settler.getProposalHash(
+ proposal,
+ intent,
+ solver
+ )
+ expect(settlerEvents[0].args.proposal).to.be.equal(proposalHash)
+ })
})
- })
- })
- })
- context('when the chain is not the current chain', () => {
- beforeEach('set chain', () => {
- callIntentParams.chainId = 1
- })
+ context('when the user is not a smart account', () => {
+ beforeEach('set proposal data', () => {
+ dynamicCallProposalParams.datas = ['0x']
+ })
- itReverts('SettlerInvalidChain')
- })
- })
- })
+ context('when the user is an EOA', () => {
+ beforeEach('set intent user', async () => {
+ intentParams.feePayer = other
+ dynamicCallOperationParams.user = other
+ })
- context('when the proposal has not been signed properly', () => {
- beforeEach('disallow proposal signer', async () => {
- await controller.connect(admin).setAllowedProposalSigners([admin], [false])
- })
+ itReverts('SettlerUserNotSmartAccount')
+ })
- it('reverts', async () => {
- const intent = createIntent(intentParams)
- const proposal = createProposal(proposalParams)
- const signature = await signProposal(settler, intent, solver, proposal, admin)
+ context('when the user is another contract', () => {
+ beforeEach('set intent user', async () => {
+ intentParams.feePayer = token
+ dynamicCallOperationParams.user = token
+ })
- await expect(
- settler.execute([{ intent, proposal, signature }])
- ).to.be.revertedWithCustomError(settler, 'SettlerProposalSignerNotAllowed')
- })
- })
- })
+ itReverts('SettlerUserNotSmartAccount')
+ })
+ })
+ })
- context('when the validations are not in order', () => {
- beforeEach('set intent validations in disorder', async () => {
- await addValidations(settler, intentParams, [validator1, validator2])
- intentParams.validations = intentParams.validations?.reverse()
- })
+ context('when the chain is not the current chain', () => {
+ beforeEach('set chain', () => {
+ dynamicCallOperationParams.chainId = 1
+ })
- itReverts('SettlerValidatorDuplicatedOrUnsorted')
- })
+ itReverts('SettlerInvalidChain')
+ })
+ })
- context('when the validations are the same', () => {
- beforeEach('set duplicate validations', async () => {
- await addValidations(settler, intentParams, [validator1, validator1])
- })
- itReverts('SettlerValidatorDuplicatedOrUnsorted')
- })
- })
+ context('for cross chain swap operations', () => {
+ const swapOperationParams: Partial = {}
+ const swapProposalParams: Partial = {}
+ let tokenIn: TokenMock, tokenOut: TokenMock, executor: MintExecutorMock
+
+ const amountIn = fp(1)
+ const proposedAmountOut = amountIn - 1n
+ const minAmount = proposedAmountOut - 1n
+
+ beforeEach('set tokens', async () => {
+ tokenIn = await ethers.deployContract('TokenMock', ['IN', 18])
+ tokenOut = await ethers.deployContract('TokenMock', ['OUT', 18])
+ swapOperationParams.tokensIn = [{ token: tokenIn, amount: amountIn }]
+ swapOperationParams.tokensOut = [
+ { token: tokenOut, recipient: other, minAmount },
+ ]
+ })
- context('when the validators are not allowed', () => {
- itReverts('SettlerValidatorNotAllowed')
- })
- })
+ beforeEach('set executor', async () => {
+ executor = await ethers.deployContract('MintExecutorMock')
+ swapProposalParams.executor = executor
+ })
- context('when the validations are less than the required validations', () => {
- beforeEach('set intent validations', async () => {
- await addValidations(settler, intentParams, [validator2])
- })
- itReverts('SettlerIntentValidationsNotEnough')
- })
- }
- )
-
- context(
- 'when the intent minimum validations is less than the controller minimum validations',
- () => {
- beforeEach('set min validations', async () => {
- intentParams.minValidations = 1
- await controller.connect(admin).setMinValidations(2)
- })
+ beforeEach('mint and approve tokens', async () => {
+ await tokenIn.mint(user, amountIn)
+ await tokenIn.connect(user).approve(settler, amountIn)
+ swapOperationParams.user = user
+ })
- beforeEach('set intent', async () => {
- const futureIntent = createSwapIntent(intentParams)
- intentParams.op = futureIntent.op
- intentParams.configSig = randomSig()
- intentParams.data = futureIntent.data
- intentParams.events = []
- })
+ const itReverts = (reason: string) => {
+ it('reverts', async () => {
+ const intent = createCrossChainSwapIntent(intentParams, swapOperationParams)
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createSwapProposal({
+ ...proposalParams,
+ ...swapProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
- const validator1 = Wallet.createRandom()
- const validator2 = Wallet.createRandom()
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, reason)
+ })
+ }
+
+ const itValidatesIntentsProperly = (
+ sourceChain: number,
+ destinationChain: number
+ ) => {
+ beforeEach('set source and destination chains', () => {
+ swapOperationParams.sourceChain = sourceChain
+ swapOperationParams.destinationChain = destinationChain
+ })
- context('when the validations are more or equal than the required validations', () => {
- beforeEach('set intent validations', async () => {
- await addValidations(settler, intentParams, [validator1, validator2])
- })
- itReverts('SettlerValidatorNotAllowed')
- })
+ context('when there is only one cross chain swap', () => {
+ context('when the proposed amounts length is correct', () => {
+ beforeEach('set proposed amounts', () => {
+ swapProposalParams.amountsOut = [proposedAmountOut]
+ })
+
+ context('when no recipient is the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(swapOperationParams.tokensOut).forEach((tokenOut) => {
+ tokenOut.recipient = other
+ })
+ })
+
+ context(
+ 'when the proposal amount is greater than the min amount',
+ () => {
+ beforeEach('set proposal amount', () => {
+ swapProposalParams.amountsOut = [minAmount + 1n]
+ })
+
+ const itExecutesTheProposalSuccessfully = () => {
+ const itExecutesSuccessfully = () => {
+ it('executes successfully', async () => {
+ const intent = createCrossChainSwapIntent(
+ intentParams,
+ swapOperationParams
+ )
+
+ await addValidations(settler, intent, [
+ validator1,
+ validator2,
+ ])
+ const proposal = createSwapProposal({
+ ...proposalParams,
+ ...swapProposalParams,
+ })
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const executorEvents = await executor.queryFilter(
+ executor.filters.Minted(),
+ tx.blockNumber
+ )
+ expect(executorEvents).to.have.lengthOf(1)
+
+ const settlerEvents = await settler.queryFilter(
+ settler.filters.ProposalExecuted(),
+ tx.blockNumber
+ )
+ expect(settlerEvents).to.have.lengthOf(1)
+
+ const proposalHash = await settler.getProposalHash(
+ proposal,
+ intent,
+ solver
+ )
+ expect(settlerEvents[0].args.proposal).to.be.equal(
+ proposalHash
+ )
+ })
+ }
+
+ context(
+ 'when the amount out is greater than the proposal amount',
+ () => {
+ const amountOut = proposedAmountOut + 1n
+
+ beforeEach('set swap proposal data', async () => {
+ swapProposalParams.executorData =
+ AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[tokenOut.target], [amountOut]]
+ )
+ })
+
+ itExecutesSuccessfully()
+ }
+ )
+
+ context(
+ 'when the amount out is lower than the proposal amount',
+ () => {
+ const amountOut = proposedAmountOut - 1n
+
+ beforeEach('set swap proposal data', async () => {
+ swapProposalParams.executorData =
+ AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[tokenOut.target], [amountOut]]
+ )
+ })
+
+ if (destinationChain == 31337)
+ itReverts('SettlerAmountOutLtProposed')
+ else itExecutesSuccessfully()
+ }
+ )
+ }
+
+ context('when the executor is allowed', () => {
+ beforeEach('allow executor', async () => {
+ await controller
+ .connect(admin)
+ .setAllowedExecutors([executor], [true])
+ })
+
+ itExecutesTheProposalSuccessfully()
+ })
+
+ context('when the executor is not allowed', () => {
+ beforeEach('disallow executor', async () => {
+ await controller
+ .connect(admin)
+ .setAllowedExecutors([executor], [false])
+ })
+
+ if (sourceChain == destinationChain)
+ itExecutesTheProposalSuccessfully()
+ else itReverts('SettlerExecutorNotAllowed')
+ })
+ }
+ )
+
+ context('when the proposal amount is lower than the min amount', () => {
+ beforeEach('set proposal amount', () => {
+ swapProposalParams.amountsOut = [minAmount - 1n]
+ })
+
+ itReverts('SettlerProposedAmountLtMinAmount')
+ })
+ })
+
+ context('when a recipient is the settler', () => {
+ beforeEach('set recipient', () => {
+ toArray(swapOperationParams.tokensOut).forEach((tokenOut) => {
+ tokenOut.recipient = settler
+ })
+ })
+
+ itReverts('SettlerInvalidRecipient')
+ })
+ })
+
+ context('when the proposed amounts length is not correct', () => {
+ beforeEach('set proposed amounts', () => {
+ swapProposalParams.amountsOut = [minAmount, minAmount]
+ })
+
+ itReverts('SettlerInvalidProposedAmounts')
+ })
+ })
+
+ context('when there is more than one operation', () => {
+ let extraOperation: Operation
+
+ beforeEach('set operation', () => {
+ extraOperation = createTransferOperation()
+ })
+
+ it('reverts', async () => {
+ const intent = createCrossChainSwapIntent(
+ intentParams,
+ swapOperationParams
+ )
+ intent.operations.push(extraOperation)
+ await addValidations(settler, intent, [validator1, validator2])
+ const proposal = createSwapProposal({
+ ...proposalParams,
+ ...swapProposalParams,
+ })
+ proposal.datas.push('0x')
+ const signature = await signProposal(
+ settler,
+ intent,
+ solver,
+ proposal,
+ admin
+ )
+
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(
+ settler,
+ 'SettlerCrossChainSwapMustBeOnlyOperation'
+ )
+ })
+ })
+ }
+
+ context('when both chains are different', () => {
+ context('when the source chain is the current chain', () => {
+ itValidatesIntentsProperly(31337, 1)
+ })
+
+ context('when the destination chain is the current chain', () => {
+ itValidatesIntentsProperly(1, 31337)
+ })
+ })
+
+ context('when both chains are equal', () => {
+ beforeEach('set chains', () => {
+ swapOperationParams.sourceChain = 1
+ swapOperationParams.destinationChain = 1
+ })
+
+ itReverts('SettlerOperationChainsMismatch')
+ })
+ })
+ })
+
+ context('when the proposal has not been signed properly', () => {
+ beforeEach('disallow proposal signer', async () => {
+ await controller.connect(admin).setAllowedProposalSigners([admin], [false])
+ })
+
+ it('reverts', async () => {
+ const intent = createIntent(intentParams)
+ const proposal = createProposal(proposalParams)
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+
+ await expect(
+ settler.execute(intent, proposal, signature)
+ ).to.be.revertedWithCustomError(settler, 'SettlerProposalSignerNotAllowed')
+ })
+ })
+ })
+
+ context('when the validations are not in order', () => {
+ beforeEach('set intent validations in disorder', async () => {
+ await addValidations(settler, intentParams, [validator1, validator2])
+ intentParams.validations = intentParams.validations?.reverse()
+ })
+
+ itReverts('SettlerValidatorDuplicatedOrUnsorted')
+ })
+
+ context('when the validations are the same', () => {
+ beforeEach('set duplicate validations', async () => {
+ await addValidations(settler, intentParams, [validator1, validator1])
+ })
+ itReverts('SettlerValidatorDuplicatedOrUnsorted')
+ })
+ })
+
+ context('when the validators are not allowed', () => {
+ itReverts('SettlerValidatorNotAllowed')
+ })
+ })
+
+ context('when the validations are less than the required validations', () => {
+ beforeEach('set intent validations', async () => {
+ await addValidations(settler, intentParams, [validator2])
+ })
+ itReverts('SettlerIntentValidationsNotEnough')
+ })
+ }
+ )
+
+ context(
+ 'when the intent minimum validations is less than the controller minimum validations',
+ () => {
+ beforeEach('set min validations', async () => {
+ intentParams.minValidations = 1
+ await controller.connect(admin).setMinValidations(2)
+ })
+
+ beforeEach('set intent', async () => {
+ const futureIntent = createSwapIntent(intentParams, { user: intentParams.feePayer })
+ intentParams.triggerSig = randomSig()
+ intentParams.operations = futureIntent.operations
+ intentParams.events = []
+ })
- context('when the validations are less than the required validations', () => {
- beforeEach('set intent validations', async () => {
- await addValidations(settler, intentParams, [validator2])
- })
- itReverts('SettlerIntentValidationsNotEnough')
+ const validator1 = Wallet.createRandom()
+ const validator2 = Wallet.createRandom()
+
+ context('when the validations are more or equal than the required validations', () => {
+ beforeEach('set intent validations', async () => {
+ await addValidations(settler, intentParams, [validator1, validator2])
+ })
+ itReverts('SettlerValidatorNotAllowed')
+ })
+
+ context('when the validations are less than the required validations', () => {
+ beforeEach('set intent validations', async () => {
+ await addValidations(settler, intentParams, [validator2])
+ })
+ itReverts('SettlerIntentValidationsNotEnough')
+ })
+ }
+ )
+ })
+
+ context('when the proposal fee is greater than the intent max fee', () => {
+ beforeEach('set proposal fee', () => {
+ proposalParams.fees = [feeAmount + 1n]
})
- }
- )
+
+ itReverts('SettlerSolverFeeTooHigh')
+ })
+ })
+
+ context('when the proposal fee length is not correct', () => {
+ beforeEach('set proposal invalid fees', () => {
+ proposalParams.fees = []
+ })
+
+ itReverts('SettlerSolverFeeInvalidLength')
+ })
})
- context('when the proposal fee is greater than the intent max fee', () => {
- beforeEach('set proposal fee', () => {
- proposalParams.fees = [feeAmount + 1n]
+ context('when the proposal deadline has been reached', () => {
+ beforeEach('set deadline', async () => {
+ const now = await currentTimestamp()
+ proposalParams.deadline = now - BigInt(5 * 60)
})
- itReverts('SettlerSolverFeeTooHigh')
+ itRevertsUnlessDestinationChain('SettlerProposalPastDeadline')
})
})
- context('when the proposal fee length is not correct', () => {
- beforeEach('set proposal invalid fees', () => {
- proposalParams.fees = []
+ context('when the intent deadline has been reached', () => {
+ beforeEach('set deadline', async () => {
+ const now = await currentTimestamp()
+ intentParams.deadline = now - BigInt(5 * 60)
})
- itReverts('SettlerSolverFeeInvalidLength')
+ itRevertsUnlessDestinationChain('SettlerIntentPastDeadline')
})
})
- context('when the proposal deadline has been reached', () => {
- beforeEach('set deadline', async () => {
- const now = await currentTimestamp()
- proposalParams.deadline = now - BigInt(5 * 60)
+ context('when the proposal datas length does not match the intent operations length', () => {
+ beforeEach('set data', () => {
+ intentParams.operations = [createTransferOperation()]
+ proposalParams.datas = [randomHex(32), randomHex(32)]
})
- itRevertsUnlessDestinationChain('SettlerProposalPastDeadline')
+ itReverts('SettlerProposalDataInvalidLength')
})
})
- context('when the intent deadline has been reached', () => {
- beforeEach('set deadline', async () => {
- const now = await currentTimestamp()
- intentParams.deadline = now - BigInt(5 * 60)
+ context('when the operations are empty', () => {
+ beforeEach('set operations', () => {
+ intentParams.operations = []
})
- itRevertsUnlessDestinationChain('SettlerIntentPastDeadline')
+ itReverts('SettlerIntentOperationsEmpty')
})
})
- context('when the nonce has already been used', () => {
- const nonce = ONES_BYTES32
+ context('when the intent has already been executed', () => {
+ let intent: Intent
+ let proposal: Proposal
- beforeEach('use nonce once', async () => {
+ beforeEach('execute intent once', async () => {
intentParams.maxFees = []
- intentParams.nonce = nonce
+ intentParams.nonce = ONES_BYTES32
intentParams.validations = []
intentParams.minValidations = 0
- const intent = createSwapIntent({ ...intentParams, deadline: MAX_UINT256 })
+ intentParams.deadline = MAX_UINT256
+
+ intent = createSwapIntent(intentParams)
const executor = await ethers.deployContract('EmptyExecutorMock')
- const proposal = createSwapProposal({ ...proposalParams, deadline: MAX_UINT256, executor })
+
+ proposalParams.deadline = MAX_UINT256
+ proposalParams.executor = toAddress(executor)
+
+ proposal = createSwapProposal(proposalParams)
const signature = await signProposal(settler, intent, solver, proposal, admin)
await controller.connect(admin).setAllowedProposalSigners([admin], [true])
- await settler.execute([{ intent, proposal, signature }])
+ await settler.execute(intent, proposal, signature)
})
- itReverts('SettlerNonceAlreadyUsed')
+ it('reverts', async () => {
+ await expect(settler.execute(intent, proposal, '0x')).to.be.revertedWithCustomError(
+ settler,
+ 'SettlerIntentAlreadyExecuted'
+ )
+ })
})
})
@@ -1215,102 +1767,109 @@ describe('Settler', () => {
await controller.connect(admin).setAllowedSolvers([solver], [true])
settler = settler.connect(solver)
})
+ let intent: Intent
- context('single intent', () => {
- let intent: Intent
-
- context('swap', () => {
- let recipient: HardhatEthersSigner
+ context('swap', () => {
+ let recipient: HardhatEthersSigner
- beforeEach('set recipient', async () => {
- recipient = other
- })
+ beforeEach('set recipient', async () => {
+ recipient = other
+ })
- context('single-chain', () => {
- const sourceChain = 31337
- const destinationChain = 31337
+ context('single-chain', () => {
+ const sourceChain = 31337
+ const destinationChain = 31337
- context('withdraw', () => {
- let executor: TransferExecutorMock
+ context('withdraw', () => {
+ let executor: TransferExecutorMock
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('TransferExecutorMock')
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('TransferExecutorMock')
+ })
- context('single token', () => {
- let token: TokenMock
+ context('single token', () => {
+ let token: TokenMock
- const amount = fp(1)
- const minAmount = fp(0.99999)
+ const amount = fp(1)
+ const minAmount = fp(0.99999)
- beforeEach('deploy token', async () => {
- token = await ethers.deployContract('TokenMock', ['WETH', 18])
- })
+ beforeEach('deploy token', async () => {
+ token = await ethers.deployContract('TokenMock', ['WETH', 18])
+ })
- beforeEach('mint and approve tokens', async () => {
- await token.mint(user, amount)
- await token.connect(user).approve(settler, amount)
- })
+ beforeEach('mint and approve tokens', async () => {
+ await token.mint(user, amount)
+ await token.connect(user).approve(settler, amount)
+ })
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ beforeEach('create intent', async () => {
+ intent = createSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
tokensIn: { token, amount },
tokensOut: { token, minAmount, recipient },
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preUserBalance = await token.balanceOf(user)
- const preRecipientBalance = await token.balanceOf(recipient)
- const preExecutorBalance = await token.balanceOf(executor)
+ it('executes the intent', async () => {
+ const preUserBalance = await token.balanceOf(user)
+ const preRecipientBalance = await token.balanceOf(recipient)
+ const preExecutorBalance = await token.balanceOf(executor)
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[token.target], [minAmount]]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmount })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[token.target], [minAmount]]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmount })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postUserBalance = await token.balanceOf(user)
- expect(preUserBalance - postUserBalance).to.be.eq(amount)
+ const postUserBalance = await token.balanceOf(user)
+ expect(preUserBalance - postUserBalance).to.be.eq(amount)
- const postRecipientBalance = await token.balanceOf(recipient)
- expect(postRecipientBalance - preRecipientBalance).to.be.eq(minAmount)
+ const postRecipientBalance = await token.balanceOf(recipient)
+ expect(postRecipientBalance - preRecipientBalance).to.be.eq(minAmount)
- const postExecutorBalance = await token.balanceOf(executor)
- expect(postExecutorBalance - preExecutorBalance).to.be.eq(amount - minAmount)
- })
+ const postExecutorBalance = await token.balanceOf(executor)
+ expect(postExecutorBalance - preExecutorBalance).to.be.eq(amount - minAmount)
})
+ })
- context('multi token', () => {
- let token1: TokenMock, token2: TokenMock
+ context('multi token', () => {
+ let token1: TokenMock, token2: TokenMock
- const amount1 = fp(1)
- const amount2 = fp(2)
- const minAmountOut1 = fp(0.99999)
- const minAmountOut2 = fp(1.99999)
+ const amount1 = fp(1)
+ const amount2 = fp(2)
+ const minAmountOut1 = fp(0.99999)
+ const minAmountOut2 = fp(1.99999)
- beforeEach('deploy tokens', async () => {
- token1 = await ethers.deployContract('TokenMock', ['TKN1', 18])
- token2 = await ethers.deployContract('TokenMock', ['TKN2', 18])
- })
+ beforeEach('deploy tokens', async () => {
+ token1 = await ethers.deployContract('TokenMock', ['TKN1', 18])
+ token2 = await ethers.deployContract('TokenMock', ['TKN2', 18])
+ })
- beforeEach('mint and approve tokens', async () => {
- await token1.mint(user, amount1)
- await token1.connect(user).approve(settler, amount1)
+ beforeEach('mint and approve tokens', async () => {
+ await token1.mint(user, amount1)
+ await token1.connect(user).approve(settler, amount1)
- await token2.mint(user, amount2)
- await token2.connect(user).approve(settler, amount2)
- })
+ await token2.mint(user, amount2)
+ await token2.connect(user).approve(settler, amount2)
+ })
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ beforeEach('create intent', async () => {
+ intent = createSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
@@ -1322,225 +1881,236 @@ describe('Settler', () => {
{ token: token1, minAmount: minAmountOut1, recipient },
{ token: token2, minAmount: minAmountOut2, recipient },
],
- })
- })
-
- it('executes the intent', async () => {
- const preUserBalance1 = await token1.balanceOf(user)
- const preUserBalance2 = await token2.balanceOf(user)
- const preRecipientBalance1 = await token1.balanceOf(recipient)
- const preRecipientBalance2 = await token2.balanceOf(recipient)
- const preExecutorBalance1 = await token1.balanceOf(executor)
- const preExecutorBalance2 = await token2.balanceOf(executor)
+ }
+ )
+ })
- const amountsOut = [minAmountOut1, minAmountOut2]
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [
- [token1.target, token2.target],
- [minAmountOut1, minAmountOut2],
- ]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ it('executes the intent', async () => {
+ const preUserBalance1 = await token1.balanceOf(user)
+ const preUserBalance2 = await token2.balanceOf(user)
+ const preRecipientBalance1 = await token1.balanceOf(recipient)
+ const preRecipientBalance2 = await token2.balanceOf(recipient)
+ const preExecutorBalance1 = await token1.balanceOf(executor)
+ const preExecutorBalance2 = await token2.balanceOf(executor)
+
+ const amountsOut = [minAmountOut1, minAmountOut2]
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [
+ [token1.target, token2.target],
+ [minAmountOut1, minAmountOut2],
+ ]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postUserBalance1 = await token1.balanceOf(user)
- expect(preUserBalance1 - postUserBalance1).to.be.eq(amount1)
+ const postUserBalance1 = await token1.balanceOf(user)
+ expect(preUserBalance1 - postUserBalance1).to.be.eq(amount1)
- const postRecipientBalance1 = await token1.balanceOf(recipient)
- expect(postRecipientBalance1 - preRecipientBalance1).to.be.eq(minAmountOut1)
+ const postRecipientBalance1 = await token1.balanceOf(recipient)
+ expect(postRecipientBalance1 - preRecipientBalance1).to.be.eq(minAmountOut1)
- const postExecutorBalance1 = await token1.balanceOf(executor)
- expect(postExecutorBalance1 - preExecutorBalance1).to.be.eq(amount1 - minAmountOut1)
+ const postExecutorBalance1 = await token1.balanceOf(executor)
+ expect(postExecutorBalance1 - preExecutorBalance1).to.be.eq(amount1 - minAmountOut1)
- const postUserBalance2 = await token2.balanceOf(user)
- expect(preUserBalance2 - postUserBalance2).to.be.eq(amount2)
+ const postUserBalance2 = await token2.balanceOf(user)
+ expect(preUserBalance2 - postUserBalance2).to.be.eq(amount2)
- const postRecipientBalance2 = await token2.balanceOf(recipient)
- expect(postRecipientBalance2 - preRecipientBalance2).to.be.eq(minAmountOut2)
+ const postRecipientBalance2 = await token2.balanceOf(recipient)
+ expect(postRecipientBalance2 - preRecipientBalance2).to.be.eq(minAmountOut2)
- const postExecutorBalance2 = await token2.balanceOf(executor)
- expect(postExecutorBalance2 - preExecutorBalance2).to.be.eq(amount2 - minAmountOut2)
- })
+ const postExecutorBalance2 = await token2.balanceOf(executor)
+ expect(postExecutorBalance2 - preExecutorBalance2).to.be.eq(amount2 - minAmountOut2)
})
})
+ })
- context('swap', () => {
- let executor: TransferExecutorMock
+ context('swap', () => {
+ let executor: TransferExecutorMock
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('TransferExecutorMock')
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('TransferExecutorMock')
+ })
- context('single tokens', () => {
- let from: HardhatEthersSigner | SmartAccount
- let tokenIn: TokenMock | string, tokenOut: TokenMock | string
+ context('single tokens', () => {
+ let from: HardhatEthersSigner | SmartAccount
+ let tokenIn: TokenMock | string, tokenOut: TokenMock | string
- const minAmountOut = fp(1) // WETH
+ const minAmountOut = fp(1) // WETH
- const _itExecutesTheIntent = (amountIn: BigNumberish) => {
- const eventTopic = randomHex(32)
- const eventData = randomHex(120)
+ const _itExecutesTheIntent = (amountIn: BigNumberish) => {
+ const eventTopic = randomHex(32)
+ const eventData = randomHex(120)
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ beforeEach('create intent', async () => {
+ intent = createSwapIntent(
+ {
settler,
+ feePayer: toAddress(from),
+ },
+ {
user: toAddress(from),
sourceChain,
destinationChain,
tokensIn: { token: tokenIn, amount: amountIn },
tokensOut: { token: tokenOut, minAmount: minAmountOut, recipient },
events: [{ topic: eventTopic, data: eventData }],
- })
- })
-
- it('executes the intent', async () => {
- const preBalanceIn = await balanceOf(tokenIn, intent.user)
- const preBalanceOut = await balanceOf(tokenOut, recipient)
+ }
+ )
+ })
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[toAddress(tokenOut)], [minAmountOut]]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmountOut })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ it('executes the intent', async () => {
+ const preBalanceIn = await balanceOf(tokenIn, intent.feePayer)
+ const preBalanceOut = await balanceOf(tokenOut, recipient)
- const postBalanceIn = await balanceOf(tokenIn, intent.user)
- expect(preBalanceIn - postBalanceIn).to.be.eq(amountIn)
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[toAddress(tokenOut)], [minAmountOut]]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmountOut })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postBalanceOut = await balanceOf(tokenOut, recipient)
- expect(postBalanceOut - preBalanceOut).to.be.eq(minAmountOut)
- })
+ const postBalanceIn = await balanceOf(tokenIn, intent.feePayer)
+ expect(preBalanceIn - postBalanceIn).to.be.eq(amountIn)
- it('logs the intent events correctly', async () => {
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[toAddress(tokenOut)], [minAmountOut]]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmountOut })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const events = await settler.queryFilter(settler.filters.IntentExecuted(), tx.blockNumber)
- expect(events).to.have.lengthOf(1)
-
- expect(events[0].args.user).to.be.equal(intent.user)
- expect(events[0].args.topic).to.be.equal(eventTopic)
- expect(events[0].args.op).to.be.equal(OpType.Swap)
- expect(events[0].args.intent).to.not.be.undefined
- expect(events[0].args.proposal).to.not.be.undefined
- expect(events[0].args.output).to.not.be.undefined
- expect(events[0].args.data).to.be.equal(eventData)
- })
- }
+ const postBalanceOut = await balanceOf(tokenOut, recipient)
+ expect(postBalanceOut - preBalanceOut).to.be.eq(minAmountOut)
+ })
- const itExecutesTheIntent = (amountIn: BigNumberish) => {
- context('when the token out is an ERC20', () => {
- beforeEach('deploy token out and fund executor', async () => {
- tokenOut = await ethers.deployContract('TokenMock', ['WETH', 18])
- await tokenOut.mint(executor, minAmountOut)
- })
+ it('logs the intent events correctly', async () => {
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[toAddress(tokenOut)], [minAmountOut]]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmountOut })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(1)
+
+ expect(events[0].args.user).to.be.equal(intent.operations[0].user)
+ expect(events[0].args.topic).to.be.equal(eventTopic)
+ expect(events[0].args.opType).to.be.equal(OpType.Swap)
+ expect(events[0].args.operation).to.not.be.undefined
+ expect(events[0].args.proposal).to.not.be.undefined
+ expect(events[0].args.intentHash).to.be.equal(hashIntent(intent))
+ expect(events[0].args.output).to.not.be.undefined
+ expect(events[0].args.data).to.be.equal(eventData)
+ })
+ }
- _itExecutesTheIntent(amountIn)
+ const itExecutesTheIntent = (amountIn: BigNumberish) => {
+ context('when the token out is an ERC20', () => {
+ beforeEach('deploy token out and fund executor', async () => {
+ tokenOut = await ethers.deployContract('TokenMock', ['WETH', 18])
+ await tokenOut.mint(executor, minAmountOut)
})
- context('when the token out is the native token', () => {
- beforeEach('set token out and fund executor', async () => {
- tokenOut = NATIVE_TOKEN_ADDRESS
- await owner.sendTransaction({ to: executor, value: minAmountOut })
- })
-
- _itExecutesTheIntent(amountIn)
- })
- }
+ _itExecutesTheIntent(amountIn)
+ })
- context('when the user is a smart account', () => {
- beforeEach('set from', async () => {
- from = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ context('when the token out is the native token', () => {
+ beforeEach('set token out and fund executor', async () => {
+ tokenOut = NATIVE_TOKEN_ADDRESS
+ await owner.sendTransaction({ to: executor, value: minAmountOut })
})
- context('when the token in is an ERC20', () => {
- const amountIn = BigInt(3000 * 1e6) // USDC
+ _itExecutesTheIntent(amountIn)
+ })
+ }
- beforeEach('deploy token in', async () => {
- tokenIn = await ethers.deployContract('TokenMock', ['USDC', 6])
- })
+ context('when the user is a smart account', () => {
+ beforeEach('set from', async () => {
+ from = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ })
- beforeEach('mint tokens', async () => {
- await tokenIn.mint(from, amountIn)
- })
+ context('when the token in is an ERC20', () => {
+ const amountIn = BigInt(3000 * 1e6) // USDC
- itExecutesTheIntent(amountIn)
+ beforeEach('deploy token in', async () => {
+ tokenIn = await ethers.deployContract('TokenMock', ['USDC', 6])
})
- context('when the token in is the native token', () => {
- const amountIn = fp(1.1) // ETH
-
- beforeEach('set token in', async () => {
- tokenIn = NATIVE_TOKEN_ADDRESS
- })
-
- beforeEach('fund user', async () => {
- await owner.sendTransaction({ to: from, value: amountIn })
- })
-
- itExecutesTheIntent(amountIn)
+ beforeEach('mint tokens', async () => {
+ await tokenIn.mint(from, amountIn)
})
- })
- context('when the user is not a smart account', () => {
- const amountIn = BigInt(2900 * 1e6) // USDC
+ itExecutesTheIntent(amountIn)
+ })
- beforeEach('set from', async () => {
- from = user
- })
+ context('when the token in is the native token', () => {
+ const amountIn = fp(1.1) // ETH
- beforeEach('deploy token in', async () => {
- tokenIn = await ethers.deployContract('TokenMock', ['USDC', 6])
+ beforeEach('set token in', async () => {
+ tokenIn = NATIVE_TOKEN_ADDRESS
})
- beforeEach('mint and approve tokens', async () => {
- await tokenIn.mint(from, amountIn)
- await tokenIn.connect(from).approve(settler, amountIn)
+ beforeEach('fund user', async () => {
+ await owner.sendTransaction({ to: from, value: amountIn })
})
itExecutesTheIntent(amountIn)
})
})
- context('multi token', () => {
- let tokenIn1: TokenMock, tokenIn2: TokenMock, tokenIn3: TokenMock
- let tokenOut1: TokenMock, tokenOut2: TokenMock | string
+ context('when the user is not a smart account', () => {
+ const amountIn = BigInt(2900 * 1e6) // USDC
- const amountIn1 = fp(1)
- const amountIn2 = fp(2)
- const amountIn3 = fp(3)
- const minAmountOut1 = fp(0.99999)
- const minAmountOut2 = fp(1.99999)
+ beforeEach('set from', async () => {
+ from = user
+ })
- beforeEach('deploy tokens', async () => {
- tokenIn1 = await ethers.deployContract('TokenMock', ['IN1', 18])
- tokenIn2 = await ethers.deployContract('TokenMock', ['IN2', 18])
- tokenIn3 = await ethers.deployContract('TokenMock', ['IN3', 18])
+ beforeEach('deploy token in', async () => {
+ tokenIn = await ethers.deployContract('TokenMock', ['USDC', 6])
})
beforeEach('mint and approve tokens', async () => {
- await tokenIn1.mint(user, amountIn1)
- await tokenIn1.connect(user).approve(settler, amountIn1)
+ await tokenIn.mint(from, amountIn)
+ await tokenIn.connect(from).approve(settler, amountIn)
+ })
- await tokenIn2.mint(user, amountIn2)
- await tokenIn2.connect(user).approve(settler, amountIn2)
+ itExecutesTheIntent(amountIn)
+ })
+ })
- await tokenIn3.mint(user, amountIn3)
- await tokenIn3.connect(user).approve(settler, amountIn3)
- })
+ context('multi token', () => {
+ let tokenIn1: TokenMock, tokenIn2: TokenMock, tokenIn3: TokenMock
+ let tokenOut1: TokenMock, tokenOut2: TokenMock | string
+
+ const amountIn1 = fp(1)
+ const amountIn2 = fp(2)
+ const amountIn3 = fp(3)
+ const minAmountOut1 = fp(0.99999)
+ const minAmountOut2 = fp(1.99999)
+
+ beforeEach('deploy tokens', async () => {
+ tokenIn1 = await ethers.deployContract('TokenMock', ['IN1', 18])
+ tokenIn2 = await ethers.deployContract('TokenMock', ['IN2', 18])
+ tokenIn3 = await ethers.deployContract('TokenMock', ['IN3', 18])
+ })
+
+ beforeEach('mint and approve tokens', async () => {
+ await tokenIn1.mint(user, amountIn1)
+ await tokenIn1.connect(user).approve(settler, amountIn1)
+
+ await tokenIn2.mint(user, amountIn2)
+ await tokenIn2.connect(user).approve(settler, amountIn2)
- const itExecutesTheIntent = () => {
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ await tokenIn3.mint(user, amountIn3)
+ await tokenIn3.connect(user).approve(settler, amountIn3)
+ })
+
+ const itExecutesTheIntent = () => {
+ beforeEach('create intent', async () => {
+ intent = createSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
@@ -1553,222 +2123,237 @@ describe('Settler', () => {
{ token: tokenOut1, minAmount: minAmountOut1, recipient },
{ token: tokenOut2, minAmount: minAmountOut2, recipient },
],
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preBalanceIn1 = await tokenIn1.balanceOf(user)
- const preBalanceIn2 = await tokenIn2.balanceOf(user)
- const preBalanceIn3 = await tokenIn3.balanceOf(user)
- const preBalanceOut1 = await tokenOut1.balanceOf(recipient)
- const preBalanceOut2 = await balanceOf(tokenOut2, recipient)
-
- const amountsOut = [minAmountOut1, minAmountOut2]
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [
- [tokenOut1.target, toAddress(tokenOut2)],
- [minAmountOut1, minAmountOut2],
- ]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
-
- const postBalanceIn1 = await tokenIn1.balanceOf(user)
- expect(preBalanceIn1 - postBalanceIn1).to.be.eq(amountIn1)
-
- const postBalanceIn2 = await tokenIn2.balanceOf(user)
- expect(preBalanceIn2 - postBalanceIn2).to.be.eq(amountIn2)
-
- const postBalanceIn3 = await tokenIn3.balanceOf(user)
- expect(preBalanceIn3 - postBalanceIn3).to.be.eq(amountIn3)
-
- const postBalanceOut1 = await tokenOut1.balanceOf(recipient)
- expect(postBalanceOut1 - preBalanceOut1).to.be.eq(minAmountOut1)
-
- const postBalanceOut2 = await balanceOf(tokenOut2, recipient)
- expect(postBalanceOut2 - preBalanceOut2).to.be.eq(minAmountOut2)
- })
- }
+ it('executes the intent', async () => {
+ const preBalanceIn1 = await tokenIn1.balanceOf(user)
+ const preBalanceIn2 = await tokenIn2.balanceOf(user)
+ const preBalanceIn3 = await tokenIn3.balanceOf(user)
+ const preBalanceOut1 = await tokenOut1.balanceOf(recipient)
+ const preBalanceOut2 = await balanceOf(tokenOut2, recipient)
+
+ const amountsOut = [minAmountOut1, minAmountOut2]
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [
+ [tokenOut1.target, toAddress(tokenOut2)],
+ [minAmountOut1, minAmountOut2],
+ ]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- context('when the tokens out are ERC20 tokens', () => {
- beforeEach('deploy tokens out and fund executor', async () => {
- tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
- tokenOut2 = await ethers.deployContract('TokenMock', ['OUT2', 18])
+ const postBalanceIn1 = await tokenIn1.balanceOf(user)
+ expect(preBalanceIn1 - postBalanceIn1).to.be.eq(amountIn1)
- await tokenOut1.mint(executor, minAmountOut1)
- await tokenOut2.mint(executor, minAmountOut2)
- })
+ const postBalanceIn2 = await tokenIn2.balanceOf(user)
+ expect(preBalanceIn2 - postBalanceIn2).to.be.eq(amountIn2)
+
+ const postBalanceIn3 = await tokenIn3.balanceOf(user)
+ expect(preBalanceIn3 - postBalanceIn3).to.be.eq(amountIn3)
+
+ const postBalanceOut1 = await tokenOut1.balanceOf(recipient)
+ expect(postBalanceOut1 - preBalanceOut1).to.be.eq(minAmountOut1)
- itExecutesTheIntent()
+ const postBalanceOut2 = await balanceOf(tokenOut2, recipient)
+ expect(postBalanceOut2 - preBalanceOut2).to.be.eq(minAmountOut2)
})
+ }
- context('when a token out is the native token', () => {
- beforeEach('set tokens out and fund executor', async () => {
- tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
- tokenOut2 = NATIVE_TOKEN_ADDRESS
+ context('when the tokens out are ERC20 tokens', () => {
+ beforeEach('deploy tokens out and fund executor', async () => {
+ tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
+ tokenOut2 = await ethers.deployContract('TokenMock', ['OUT2', 18])
- await tokenOut1.mint(executor, minAmountOut1)
- await owner.sendTransaction({ to: executor, value: minAmountOut2 })
- })
+ await tokenOut1.mint(executor, minAmountOut1)
+ await tokenOut2.mint(executor, minAmountOut2)
+ })
+
+ itExecutesTheIntent()
+ })
+
+ context('when a token out is the native token', () => {
+ beforeEach('set tokens out and fund executor', async () => {
+ tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
+ tokenOut2 = NATIVE_TOKEN_ADDRESS
- itExecutesTheIntent()
+ await tokenOut1.mint(executor, minAmountOut1)
+ await owner.sendTransaction({ to: executor, value: minAmountOut2 })
})
+
+ itExecutesTheIntent()
})
})
})
+ })
- context('cross-chain', () => {
- context('single token', () => {
- const amount = fp(1)
- const minAmount = fp(0.99999)
+ context('cross-chain', () => {
+ context('single token', () => {
+ const amount = fp(1)
+ const minAmount = fp(0.99999)
- context('when executing on the source chain', () => {
- const sourceChain = 31337
- const destinationChain = 1
+ context('when executing on the source chain', () => {
+ const sourceChain = 31337
+ const destinationChain = 1
- let executor: EmptyExecutorMock
- let tokenIn: TokenMock
- const tokenOut = randomEvmAddress() // forcing random address for another chain
+ let executor: EmptyExecutorMock
+ let tokenIn: TokenMock
+ const tokenOut = randomEvmAddress() // forcing random address for another chain
- beforeEach('deploy and mint tokens in', async () => {
- tokenIn = await ethers.deployContract('TokenMock', ['WETH', 18])
- await tokenIn.mint(user, amount)
- await tokenIn.connect(user).approve(settler, amount)
- })
+ beforeEach('deploy and mint tokens in', async () => {
+ tokenIn = await ethers.deployContract('TokenMock', ['WETH', 18])
+ await tokenIn.mint(user, amount)
+ await tokenIn.connect(user).approve(settler, amount)
+ })
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('EmptyExecutorMock')
- await controller.connect(admin).setAllowedExecutors([executor], [true])
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('EmptyExecutorMock')
+ await controller.connect(admin).setAllowedExecutors([executor], [true])
+ })
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ beforeEach('create intent', async () => {
+ intent = createCrossChainSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
tokensIn: { token: tokenIn, amount },
tokensOut: { token: tokenOut, minAmount, recipient },
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preUserBalance = await tokenIn.balanceOf(user)
- const preExecutorBalance = await tokenIn.balanceOf(executor)
+ it('executes the intent', async () => {
+ const preUserBalance = await tokenIn.balanceOf(user)
+ const preExecutorBalance = await tokenIn.balanceOf(executor)
- const proposal = createSwapProposal({ executor, amountsOut: minAmount })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ const proposal = createSwapProposal({ executor, amountsOut: minAmount })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postUserBalance = await tokenIn.balanceOf(user)
- expect(preUserBalance - postUserBalance).to.be.eq(amount)
+ const postUserBalance = await tokenIn.balanceOf(user)
+ expect(preUserBalance - postUserBalance).to.be.eq(amount)
- const postExecutorBalance = await tokenIn.balanceOf(executor)
- expect(postExecutorBalance - preExecutorBalance).to.be.eq(amount)
- })
+ const postExecutorBalance = await tokenIn.balanceOf(executor)
+ expect(postExecutorBalance - preExecutorBalance).to.be.eq(amount)
})
+ })
- context('when executing on the destination chain', () => {
- const sourceChain = 1
- const destinationChain = 31337
+ context('when executing on the destination chain', () => {
+ const sourceChain = 1
+ const destinationChain = 31337
- let executor: TransferExecutorMock
- let tokenOut: TokenMock | string
- const tokenIn = randomEvmAddress() // forcing random address for another chain
+ let executor: TransferExecutorMock
+ let tokenOut: TokenMock | string
+ const tokenIn = randomEvmAddress() // forcing random address for another chain
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('TransferExecutorMock')
- await controller.connect(admin).setAllowedExecutors([executor], [true])
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('TransferExecutorMock')
+ await controller.connect(admin).setAllowedExecutors([executor], [true])
+ })
- const itExecutesTheIntent = () => {
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ const itExecutesTheIntent = () => {
+ beforeEach('create intent', async () => {
+ intent = createCrossChainSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
tokensIn: { token: tokenIn, amount },
tokensOut: { token: tokenOut, minAmount, recipient },
- })
- })
-
- it('executes the intent', async () => {
- const preRecipientBalance = await balanceOf(tokenOut, recipient)
+ }
+ )
+ })
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [[toAddress(tokenOut)], [minAmount]]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmount })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ it('executes the intent', async () => {
+ const preRecipientBalance = await balanceOf(tokenOut, recipient)
- const postRecipientBalance = await balanceOf(tokenOut, recipient)
- expect(postRecipientBalance - preRecipientBalance).to.be.eq(minAmount)
- })
- }
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[toAddress(tokenOut)], [minAmount]]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut: minAmount })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- context('when the token out is an ERC20', () => {
- beforeEach('deploy token out and fund executor', async () => {
- tokenOut = await ethers.deployContract('TokenMock', ['DAI', 18])
- await tokenOut.mint(executor, minAmount)
- })
+ const postRecipientBalance = await balanceOf(tokenOut, recipient)
+ expect(postRecipientBalance - preRecipientBalance).to.be.eq(minAmount)
+ })
+ }
- itExecutesTheIntent()
+ context('when the token out is an ERC20', () => {
+ beforeEach('deploy token out and fund executor', async () => {
+ tokenOut = await ethers.deployContract('TokenMock', ['DAI', 18])
+ await tokenOut.mint(executor, minAmount)
})
- context('when the token out is the native token', () => {
- beforeEach('set token out and fund executor', async () => {
- tokenOut = NATIVE_TOKEN_ADDRESS
- await owner.sendTransaction({ to: executor, value: minAmount })
- })
+ itExecutesTheIntent()
+ })
- itExecutesTheIntent()
+ context('when the token out is the native token', () => {
+ beforeEach('set token out and fund executor', async () => {
+ tokenOut = NATIVE_TOKEN_ADDRESS
+ await owner.sendTransaction({ to: executor, value: minAmount })
})
+
+ itExecutesTheIntent()
})
})
+ })
- context('multi token', () => {
- const amountIn1 = fp(1)
- const amountIn2 = fp(2)
- const amountIn3 = fp(3)
- const minAmountOut1 = fp(0.99999)
- const minAmountOut2 = fp(1.99999)
-
- context('when executing on the source chain', () => {
- let executor: EmptyExecutorMock
- const sourceChain = 31337
- const destinationChain = 1
-
- let tokenIn1: TokenMock, tokenIn2: TokenMock, tokenIn3: TokenMock
- const tokenOut1 = randomEvmAddress() // forcing random address for another chain
- const tokenOut2 = randomEvmAddress() // forcing random address for another chain
-
- beforeEach('deploy and mint tokens in', async () => {
- tokenIn1 = await ethers.deployContract('TokenMock', ['IN1', 18])
- await tokenIn1.mint(user, amountIn1)
- await tokenIn1.connect(user).approve(settler, amountIn1)
-
- tokenIn2 = await ethers.deployContract('TokenMock', ['IN2', 18])
- await tokenIn2.mint(user, amountIn2)
- await tokenIn2.connect(user).approve(settler, amountIn2)
+ context('multi token', () => {
+ const amountIn1 = fp(1)
+ const amountIn2 = fp(2)
+ const amountIn3 = fp(3)
+ const minAmountOut1 = fp(0.99999)
+ const minAmountOut2 = fp(1.99999)
- tokenIn3 = await ethers.deployContract('TokenMock', ['IN3', 18])
- await tokenIn3.mint(user, amountIn3)
- await tokenIn3.connect(user).approve(settler, amountIn3)
- })
+ context('when executing on the source chain', () => {
+ let executor: EmptyExecutorMock
+ const sourceChain = 31337
+ const destinationChain = 1
+
+ let tokenIn1: TokenMock, tokenIn2: TokenMock, tokenIn3: TokenMock
+ const tokenOut1 = randomEvmAddress() // forcing random address for another chain
+ const tokenOut2 = randomEvmAddress() // forcing random address for another chain
+
+ beforeEach('deploy and mint tokens in', async () => {
+ tokenIn1 = await ethers.deployContract('TokenMock', ['IN1', 18])
+ await tokenIn1.mint(user, amountIn1)
+ await tokenIn1.connect(user).approve(settler, amountIn1)
+
+ tokenIn2 = await ethers.deployContract('TokenMock', ['IN2', 18])
+ await tokenIn2.mint(user, amountIn2)
+ await tokenIn2.connect(user).approve(settler, amountIn2)
+
+ tokenIn3 = await ethers.deployContract('TokenMock', ['IN3', 18])
+ await tokenIn3.mint(user, amountIn3)
+ await tokenIn3.connect(user).approve(settler, amountIn3)
+ })
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('EmptyExecutorMock')
- await controller.connect(admin).setAllowedExecutors([executor], [true])
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('EmptyExecutorMock')
+ await controller.connect(admin).setAllowedExecutors([executor], [true])
+ })
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ beforeEach('create intent', async () => {
+ intent = createCrossChainSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
@@ -1781,60 +2366,65 @@ describe('Settler', () => {
{ token: tokenOut1, minAmount: minAmountOut1, recipient },
{ token: tokenOut2, minAmount: minAmountOut2, recipient },
],
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preUserBalanceIn1 = await tokenIn1.balanceOf(user)
- const preUserBalanceIn2 = await tokenIn2.balanceOf(user)
- const preUserBalanceIn3 = await tokenIn3.balanceOf(user)
- const preExecutorBalanceIn1 = await tokenIn1.balanceOf(executor)
- const preExecutorBalanceIn2 = await tokenIn2.balanceOf(executor)
- const preExecutorBalanceIn3 = await tokenIn3.balanceOf(executor)
-
- const proposal = createSwapProposal({ executor, amountsOut: [minAmountOut1, minAmountOut2] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ it('executes the intent', async () => {
+ const preUserBalanceIn1 = await tokenIn1.balanceOf(user)
+ const preUserBalanceIn2 = await tokenIn2.balanceOf(user)
+ const preUserBalanceIn3 = await tokenIn3.balanceOf(user)
+ const preExecutorBalanceIn1 = await tokenIn1.balanceOf(executor)
+ const preExecutorBalanceIn2 = await tokenIn2.balanceOf(executor)
+ const preExecutorBalanceIn3 = await tokenIn3.balanceOf(executor)
+
+ const proposal = createSwapProposal({ executor, amountsOut: [minAmountOut1, minAmountOut2] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postUserBalanceIn1 = await tokenIn1.balanceOf(user)
- expect(preUserBalanceIn1 - postUserBalanceIn1).to.be.eq(amountIn1)
+ const postUserBalanceIn1 = await tokenIn1.balanceOf(user)
+ expect(preUserBalanceIn1 - postUserBalanceIn1).to.be.eq(amountIn1)
- const postUserBalanceIn2 = await tokenIn2.balanceOf(user)
- expect(preUserBalanceIn2 - postUserBalanceIn2).to.be.eq(amountIn2)
+ const postUserBalanceIn2 = await tokenIn2.balanceOf(user)
+ expect(preUserBalanceIn2 - postUserBalanceIn2).to.be.eq(amountIn2)
- const postUserBalanceIn3 = await tokenIn3.balanceOf(user)
- expect(preUserBalanceIn3 - postUserBalanceIn3).to.be.eq(amountIn3)
+ const postUserBalanceIn3 = await tokenIn3.balanceOf(user)
+ expect(preUserBalanceIn3 - postUserBalanceIn3).to.be.eq(amountIn3)
- const postExecutorBalanceIn1 = await tokenIn1.balanceOf(executor)
- expect(postExecutorBalanceIn1 - preExecutorBalanceIn1).to.be.eq(amountIn1)
+ const postExecutorBalanceIn1 = await tokenIn1.balanceOf(executor)
+ expect(postExecutorBalanceIn1 - preExecutorBalanceIn1).to.be.eq(amountIn1)
- const postExecutorBalanceIn2 = await tokenIn2.balanceOf(executor)
- expect(postExecutorBalanceIn2 - preExecutorBalanceIn2).to.be.eq(amountIn2)
+ const postExecutorBalanceIn2 = await tokenIn2.balanceOf(executor)
+ expect(postExecutorBalanceIn2 - preExecutorBalanceIn2).to.be.eq(amountIn2)
- const postExecutorBalanceIn3 = await tokenIn3.balanceOf(executor)
- expect(postExecutorBalanceIn3 - preExecutorBalanceIn3).to.be.eq(amountIn3)
- })
+ const postExecutorBalanceIn3 = await tokenIn3.balanceOf(executor)
+ expect(postExecutorBalanceIn3 - preExecutorBalanceIn3).to.be.eq(amountIn3)
})
+ })
- context('when executing on the destination chain', () => {
- let executor: TransferExecutorMock
- const sourceChain = 1
- const destinationChain = 31337
+ context('when executing on the destination chain', () => {
+ let executor: TransferExecutorMock
+ const sourceChain = 1
+ const destinationChain = 31337
- let tokenOut1: TokenMock, tokenOut2: TokenMock | string
- const tokenIn1 = randomEvmAddress() // forcing random address for another chain
- const tokenIn2 = randomEvmAddress() // forcing random address for another chain
- const tokenIn3 = randomEvmAddress() // forcing random address for another chain
+ let tokenOut1: TokenMock, tokenOut2: TokenMock | string
+ const tokenIn1 = randomEvmAddress() // forcing random address for another chain
+ const tokenIn2 = randomEvmAddress() // forcing random address for another chain
+ const tokenIn3 = randomEvmAddress() // forcing random address for another chain
- beforeEach('deploy executor mock', async () => {
- executor = await ethers.deployContract('TransferExecutorMock')
- await controller.connect(admin).setAllowedExecutors([executor], [true])
- })
+ beforeEach('deploy executor mock', async () => {
+ executor = await ethers.deployContract('TransferExecutorMock')
+ await controller.connect(admin).setAllowedExecutors([executor], [true])
+ })
- const itExecutesTheIntent = () => {
- beforeEach('create intent', async () => {
- intent = createSwapIntent({
+ const itExecutesTheIntent = () => {
+ beforeEach('create intent', async () => {
+ intent = createCrossChainSwapIntent(
+ {
settler,
+ feePayer: user,
+ },
+ {
user,
sourceChain,
destinationChain,
@@ -1847,252 +2437,205 @@ describe('Settler', () => {
{ token: tokenOut1, minAmount: minAmountOut1, recipient },
{ token: tokenOut2, minAmount: minAmountOut2, recipient },
],
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preRecipientBalanceOut1 = await tokenOut1.balanceOf(recipient)
- const preRecipientBalanceOut2 = await balanceOf(tokenOut2, recipient)
-
- const amountsOut = [minAmountOut1, minAmountOut2]
- const executorData = AbiCoder.defaultAbiCoder().encode(
- ['address[]', 'uint256[]'],
- [
- [tokenOut1.target, toAddress(tokenOut2)],
- [minAmountOut1, minAmountOut2],
- ]
- )
- const proposal = createSwapProposal({ executor, executorData, amountsOut })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
-
- const postRecipientBalanceOut1 = await tokenOut1.balanceOf(recipient)
- expect(postRecipientBalanceOut1 - preRecipientBalanceOut1).to.be.eq(minAmountOut1)
-
- const postRecipientBalanceOut2 = await balanceOf(tokenOut2, recipient)
- expect(postRecipientBalanceOut2 - preRecipientBalanceOut2).to.be.eq(minAmountOut2)
- })
- }
+ it('executes the intent', async () => {
+ const preRecipientBalanceOut1 = await tokenOut1.balanceOf(recipient)
+ const preRecipientBalanceOut2 = await balanceOf(tokenOut2, recipient)
+
+ const amountsOut = [minAmountOut1, minAmountOut2]
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [
+ [tokenOut1.target, toAddress(tokenOut2)],
+ [minAmountOut1, minAmountOut2],
+ ]
+ )
+ const proposal = createSwapProposal({ executor, executorData, amountsOut })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- context('when the tokens out are ERC20 tokens', () => {
- beforeEach('deploy tokens out and fund executor', async () => {
- tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
- tokenOut2 = await ethers.deployContract('TokenMock', ['OUT2', 18])
+ const postRecipientBalanceOut1 = await tokenOut1.balanceOf(recipient)
+ expect(postRecipientBalanceOut1 - preRecipientBalanceOut1).to.be.eq(minAmountOut1)
- await tokenOut1.mint(executor, minAmountOut1)
- await tokenOut2.mint(executor, minAmountOut2)
- })
+ const postRecipientBalanceOut2 = await balanceOf(tokenOut2, recipient)
+ expect(postRecipientBalanceOut2 - preRecipientBalanceOut2).to.be.eq(minAmountOut2)
+ })
+ }
- itExecutesTheIntent()
+ context('when the tokens out are ERC20 tokens', () => {
+ beforeEach('deploy tokens out and fund executor', async () => {
+ tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
+ tokenOut2 = await ethers.deployContract('TokenMock', ['OUT2', 18])
+
+ await tokenOut1.mint(executor, minAmountOut1)
+ await tokenOut2.mint(executor, minAmountOut2)
})
- context('when a token out is the native token', () => {
- beforeEach('set tokens out and fund executor', async () => {
- tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
- tokenOut2 = NATIVE_TOKEN_ADDRESS
+ itExecutesTheIntent()
+ })
- await tokenOut1.mint(executor, minAmountOut1)
- await owner.sendTransaction({ to: executor, value: minAmountOut2 })
- })
+ context('when a token out is the native token', () => {
+ beforeEach('set tokens out and fund executor', async () => {
+ tokenOut1 = await ethers.deployContract('TokenMock', ['OUT1', 18])
+ tokenOut2 = NATIVE_TOKEN_ADDRESS
- itExecutesTheIntent()
+ await tokenOut1.mint(executor, minAmountOut1)
+ await owner.sendTransaction({ to: executor, value: minAmountOut2 })
})
+
+ itExecutesTheIntent()
})
})
})
})
+ })
- context('transfer', () => {
- let recipient: HardhatEthersSigner
+ context('transfer', () => {
+ let recipient: HardhatEthersSigner
- beforeEach('set recipient', async () => {
- recipient = other
- })
+ beforeEach('set recipient', async () => {
+ recipient = other
+ })
- context('single token', () => {
- let from: HardhatEthersSigner | SmartAccount
- let token: TokenMock | string, feeToken: TokenMock | string
+ context('single token', () => {
+ let from: HardhatEthersSigner | SmartAccount
+ let token: TokenMock | string, feeToken: TokenMock | string
- const amount = fp(1)
+ const amount = fp(1)
- const itExecutesTheIntent = (feeAmount: BigNumberish) => {
- const eventTopic = randomHex(32)
- const eventData = randomHex(120)
+ const itExecutesTheIntent = (feeAmount: BigNumberish) => {
+ const eventTopic = randomHex(32)
+ const eventData = randomHex(120)
- beforeEach('create intent', async () => {
- intent = createTransferIntent({
+ beforeEach('create intent', async () => {
+ intent = createTransferIntent(
+ {
settler,
+ feePayer: toAddress(from),
+ maxFees: [{ token: feeToken, amount: feeAmount }],
+ },
+ {
user: toAddress(from),
transfers: [{ token, amount, recipient }],
- maxFees: [{ token: feeToken, amount: feeAmount }],
events: [{ topic: eventTopic, data: eventData }],
- })
- })
-
- it('executes the intent', async () => {
- const preUserTokenBalance = await balanceOf(token, intent.user)
- const preUserFeeTokenBalance = await balanceOf(feeToken, intent.user)
- const preRecipientBalance = await balanceOf(token, recipient)
- const preSolverBalance = await balanceOf(feeToken, solver)
-
- const proposal = createTransferProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const postUserTokenBalance = await balanceOf(token, intent.user)
- if (toAddress(token) == toAddress(feeToken)) {
- expect(preUserTokenBalance - postUserTokenBalance).to.be.eq(amount + feeAmount)
- } else if (feeToken !== USD_ADDRESS) {
- const postUserFeeTokenBalance = await balanceOf(feeToken, intent.user)
- expect(preUserTokenBalance - postUserTokenBalance).to.be.eq(amount)
- expect(preUserFeeTokenBalance - postUserFeeTokenBalance).to.be.eq(feeAmount)
- }
-
- const postRecipientBalance = await balanceOf(token, recipient)
- expect(postRecipientBalance - preRecipientBalance).to.be.eq(amount)
-
- const postSolverBalance = await balanceOf(feeToken, solver)
- if (feeToken == NATIVE_TOKEN_ADDRESS) {
- const txReceipt = await (await tx.getTransaction())?.wait()
- const txCost = txReceipt ? txReceipt.gasUsed * txReceipt.gasPrice : 0n
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount - txCost)
- } else if (feeToken !== USD_ADDRESS) {
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
}
- })
-
- it('logs the intent events correctly', async () => {
- const proposal = createTransferProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const events = await settler.queryFilter(settler.filters.IntentExecuted(), tx.blockNumber)
- expect(events).to.have.lengthOf(1)
-
- expect(events[0].args.user).to.be.equal(intent.user)
- expect(events[0].args.topic).to.be.equal(eventTopic)
- expect(events[0].args.op).to.be.equal(OpType.Transfer)
- expect(events[0].args.intent).to.not.be.undefined
- expect(events[0].args.proposal).to.not.be.undefined
- expect(events[0].args.output).to.be.eq('0x')
- expect(events[0].args.data).to.be.equal(eventData)
- })
- }
+ )
+ })
- context('when the user is a smart account', () => {
- beforeEach('set intent user', async () => {
- from = await ethers.deployContract('SmartAccountContract', [settler, owner])
- })
+ it('executes the intent', async () => {
+ const preUserTokenBalance = await balanceOf(token, intent.feePayer)
+ const preUserFeeTokenBalance = await balanceOf(feeToken, intent.feePayer)
+ const preRecipientBalance = await balanceOf(token, recipient)
+ const preSolverBalance = await balanceOf(feeToken, solver)
- context('when the token is an ERC20', () => {
- beforeEach('deploy token', async () => {
- token = await ethers.deployContract('TokenMock', ['WETH', 18])
- })
+ const proposal = createTransferProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const postUserTokenBalance = await balanceOf(token, intent.feePayer)
+ if (toAddress(token) == toAddress(feeToken)) {
+ expect(preUserTokenBalance - postUserTokenBalance).to.be.eq(amount + feeAmount)
+ } else if (feeToken !== USD_ADDRESS) {
+ const postUserFeeTokenBalance = await balanceOf(feeToken, intent.feePayer)
+ expect(preUserTokenBalance - postUserTokenBalance).to.be.eq(amount)
+ expect(preUserFeeTokenBalance - postUserFeeTokenBalance).to.be.eq(feeAmount)
+ }
- beforeEach('mint tokens', async () => {
- await token.mint(from, amount)
- })
+ const postRecipientBalance = await balanceOf(token, recipient)
+ expect(postRecipientBalance - preRecipientBalance).to.be.eq(amount)
- context('when the fee token is USD', () => {
- const feeAmount = fp(0.02)
+ const postSolverBalance = await balanceOf(feeToken, solver)
+ if (feeToken == NATIVE_TOKEN_ADDRESS) {
+ const txReceipt = await (await tx.getTransaction())?.wait()
+ const txCost = txReceipt ? txReceipt.gasUsed * txReceipt.gasPrice : 0n
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount - txCost)
+ } else if (feeToken !== USD_ADDRESS) {
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ }
+ })
- beforeEach('set fee token', async () => {
- feeToken = USD_ADDRESS
- })
+ it('logs the intent events correctly', async () => {
+ const proposal = createTransferProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(1)
+
+ expect(events[0].args.user).to.be.equal(intent.operations[0].user)
+ expect(events[0].args.topic).to.be.equal(eventTopic)
+ expect(events[0].args.opType).to.be.equal(OpType.Transfer)
+ expect(events[0].args.operation).to.not.be.undefined
+ expect(events[0].args.proposal).to.not.be.undefined
+ expect(events[0].args.intentHash).to.be.equal(hashIntent(intent))
+ expect(events[0].args.output).to.be.eq('0x')
+ expect(events[0].args.data).to.be.equal(eventData)
+ })
+ }
- itExecutesTheIntent(feeAmount)
- })
+ context('when the user is a smart account', () => {
+ beforeEach('set intent user', async () => {
+ from = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ })
- context('when the fee token is the transfer token', () => {
- const feeAmount = fp(0.2)
+ context('when the token is an ERC20', () => {
+ beforeEach('deploy token', async () => {
+ token = await ethers.deployContract('TokenMock', ['WETH', 18])
+ })
- beforeEach('set fee token', async () => {
- feeToken = token
- })
+ beforeEach('mint tokens', async () => {
+ await token.mint(from, amount)
+ })
- beforeEach('mint fee tokens', async () => {
- await token.mint(from, feeAmount)
- })
+ context('when the fee token is USD', () => {
+ const feeAmount = fp(0.02)
- itExecutesTheIntent(feeAmount)
+ beforeEach('set fee token', async () => {
+ feeToken = USD_ADDRESS
})
- context('when the fee token is another token', () => {
- const feeAmount = BigInt(0.01 * 1e6)
-
- beforeEach('deploy fee token', async () => {
- feeToken = await ethers.deployContract('TokenMock', ['USDC', 6])
- })
-
- beforeEach('mint fee tokens', async () => {
- await feeToken.mint(from, feeAmount)
- })
-
- itExecutesTheIntent(feeAmount)
- })
+ itExecutesTheIntent(feeAmount)
})
- context('when the token is the native token', () => {
- beforeEach('set token', async () => {
- token = NATIVE_TOKEN_ADDRESS
- })
+ context('when the fee token is the transfer token', () => {
+ const feeAmount = fp(0.2)
- beforeEach('fund user', async () => {
- await owner.sendTransaction({ to: from, value: amount })
+ beforeEach('set fee token', async () => {
+ feeToken = token
})
- context('when the fee token is USD', () => {
- const feeAmount = fp(0.02)
-
- beforeEach('set fee token', async () => {
- feeToken = USD_ADDRESS
- })
-
- itExecutesTheIntent(feeAmount)
+ beforeEach('mint fee tokens', async () => {
+ await token.mint(from, feeAmount)
})
- context('when the fee token is the native token', () => {
- const feeAmount = fp(0.02)
-
- beforeEach('set fee token', async () => {
- feeToken = token
- })
+ itExecutesTheIntent(feeAmount)
+ })
- beforeEach('fund user for fees', async () => {
- await owner.sendTransaction({ to: from, value: feeAmount })
- })
+ context('when the fee token is another token', () => {
+ const feeAmount = BigInt(0.01 * 1e6)
- itExecutesTheIntent(feeAmount)
+ beforeEach('deploy fee token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['USDC', 6])
})
- context('when the fee token is another token', () => {
- const feeAmount = BigInt(0.1 * 1e6)
-
- beforeEach('deploy fee token', async () => {
- feeToken = await ethers.deployContract('TokenMock', ['USDC', 6])
- })
-
- beforeEach('mint fee tokens', async () => {
- await feeToken.mint(from, feeAmount)
- })
-
- itExecutesTheIntent(feeAmount)
+ beforeEach('mint fee tokens', async () => {
+ await feeToken.mint(from, feeAmount)
})
- })
- })
- context('when the user is not a smart account', () => {
- beforeEach('set intent user', async () => {
- from = user
+ itExecutesTheIntent(feeAmount)
})
+ })
- beforeEach('deploy token', async () => {
- token = await ethers.deployContract('TokenMock', ['WETH', 18])
+ context('when the token is the native token', () => {
+ beforeEach('set token', async () => {
+ token = NATIVE_TOKEN_ADDRESS
})
- beforeEach('mint and approve tokens', async () => {
- await token.mint(user, amount)
- await token.connect(user).approve(settler, amount)
+ beforeEach('fund user', async () => {
+ await owner.sendTransaction({ to: from, value: amount })
})
context('when the fee token is USD', () => {
@@ -2105,32 +2648,29 @@ describe('Settler', () => {
itExecutesTheIntent(feeAmount)
})
- context('when the fee token is the transfer token', () => {
- const feeAmount = fp(0.01)
+ context('when the fee token is the native token', () => {
+ const feeAmount = fp(0.02)
beforeEach('set fee token', async () => {
feeToken = token
})
- beforeEach('mint and approve fee tokens', async () => {
- await token.mint(user, feeAmount)
- const allowance = await token.allowance(user, settler)
- await token.connect(user).approve(settler, allowance + feeAmount)
+ beforeEach('fund user for fees', async () => {
+ await owner.sendTransaction({ to: from, value: feeAmount })
})
itExecutesTheIntent(feeAmount)
})
context('when the fee token is another token', () => {
- const feeAmount = BigInt(0.2 * 1e6)
+ const feeAmount = BigInt(0.1 * 1e6)
- beforeEach('deploy token', async () => {
+ beforeEach('deploy fee token', async () => {
feeToken = await ethers.deployContract('TokenMock', ['USDC', 6])
})
- beforeEach('mint and approve tokens', async () => {
- await feeToken.mint(user, feeAmount)
- await feeToken.connect(user).approve(settler, feeAmount)
+ beforeEach('mint fee tokens', async () => {
+ await feeToken.mint(from, feeAmount)
})
itExecutesTheIntent(feeAmount)
@@ -2138,457 +2678,838 @@ describe('Settler', () => {
})
})
- context('multi token', () => {
- let token1: TokenMock, token2: TokenMock
-
- const amount1 = fp(0.5)
- const amount2 = BigInt(2 * 1e6)
- const feeAmount = fp(0.05)
+ context('when the user is not a smart account', () => {
+ beforeEach('set intent user', async () => {
+ from = user
+ })
- beforeEach('deploy tokens', async () => {
- token1 = await ethers.deployContract('TokenMock', ['TKN1', 18])
- token2 = await ethers.deployContract('TokenMock', ['TKN2', 6])
+ beforeEach('deploy token', async () => {
+ token = await ethers.deployContract('TokenMock', ['WETH', 18])
})
beforeEach('mint and approve tokens', async () => {
- const totalAmount = amount1 + feeAmount * BigInt(2)
- await token1.mint(user, totalAmount)
- await token1.connect(user).approve(settler, totalAmount)
-
- await token2.mint(user, amount2)
- await token2.connect(user).approve(settler, amount2)
+ await token.mint(user, amount)
+ await token.connect(user).approve(settler, amount)
})
- beforeEach('create intent', async () => {
- intent = createTransferIntent({
- settler,
- user,
- maxFees: [{ token: token1, amount: feeAmount }],
- transfers: [
- { token: token1, amount: amount1, recipient },
- { token: token1, amount: feeAmount, recipient: user }, // has no impact
- { token: token2, amount: amount2, recipient },
- ],
+ context('when the fee token is USD', () => {
+ const feeAmount = fp(0.02)
+
+ beforeEach('set fee token', async () => {
+ feeToken = USD_ADDRESS
})
+
+ itExecutesTheIntent(feeAmount)
})
- it('executes the intent', async () => {
- const preUserBalance1 = await token1.balanceOf(user)
- const preUserBalance2 = await token2.balanceOf(user)
- const preRecipientBalance1 = await token1.balanceOf(recipient)
- const preRecipientBalance2 = await token2.balanceOf(recipient)
- const preSolverBalance = await token1.balanceOf(solver)
+ context('when the fee token is the transfer token', () => {
+ const feeAmount = fp(0.01)
- const proposal = createTransferProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ beforeEach('set fee token', async () => {
+ feeToken = token
+ })
- const postUserBalance1 = await token1.balanceOf(user)
- expect(preUserBalance1 - postUserBalance1).to.be.eq(amount1 + feeAmount)
+ beforeEach('mint and approve fee tokens', async () => {
+ await token.mint(user, feeAmount)
+ const allowance = await token.allowance(user, settler)
+ await token.connect(user).approve(settler, allowance + feeAmount)
+ })
- const postUserBalance2 = await token2.balanceOf(user)
- expect(preUserBalance2 - postUserBalance2).to.be.eq(amount2)
+ itExecutesTheIntent(feeAmount)
+ })
- const postRecipientBalance1 = await token1.balanceOf(recipient)
- expect(postRecipientBalance1 - preRecipientBalance1).to.be.eq(amount1)
+ context('when the fee token is another token', () => {
+ const feeAmount = BigInt(0.2 * 1e6)
- const postRecipientBalance2 = await token2.balanceOf(recipient)
- expect(postRecipientBalance2 - preRecipientBalance2).to.be.eq(amount2)
+ beforeEach('deploy token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['USDC', 6])
+ })
+
+ beforeEach('mint and approve tokens', async () => {
+ await feeToken.mint(user, feeAmount)
+ await feeToken.connect(user).approve(settler, feeAmount)
+ })
- const postSolverBalance = await token1.balanceOf(solver)
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ itExecutesTheIntent(feeAmount)
})
})
})
- context('call', () => {
- context('single call', () => {
- let target: Account, data: string
- let user: SmartAccount
+ context('multi token', () => {
+ let token1: TokenMock, token2: TokenMock
- beforeEach('deploy smart account', async () => {
- user = await ethers.deployContract('SmartAccountContract', [settler, owner])
- })
+ const amount1 = fp(0.5)
+ const amount2 = BigInt(2 * 1e6)
+ const feeAmount = fp(0.05)
- context('when the target is not the settler', () => {
- let feeToken: TokenMock | string
+ beforeEach('deploy tokens', async () => {
+ token1 = await ethers.deployContract('TokenMock', ['TKN1', 18])
+ token2 = await ethers.deployContract('TokenMock', ['TKN2', 6])
+ })
- const feeAmount = fp(0.01)
+ beforeEach('mint and approve tokens', async () => {
+ const totalAmount = amount1 + feeAmount * BigInt(2)
+ await token1.mint(user, totalAmount)
+ await token1.connect(user).approve(settler, totalAmount)
- beforeEach('set target', async () => {
- target = await ethers.deployContract('CallMock')
- })
+ await token2.mint(user, amount2)
+ await token2.connect(user).approve(settler, amount2)
+ })
- context('when the call succeeds', () => {
- beforeEach('set data', async () => {
- data = target.interface.encodeFunctionData('call')
- })
+ beforeEach('create intent', async () => {
+ intent = createTransferIntent(
+ {
+ settler,
+ feePayer: user,
+ maxFees: [{ token: token1, amount: feeAmount }],
+ },
+ {
+ user,
+ transfers: [
+ { token: token1, amount: amount1, recipient },
+ { token: token1, amount: feeAmount, recipient: user }, // has no impact
+ { token: token2, amount: amount2, recipient },
+ ],
+ }
+ )
+ })
- const itExecutesTheIntentWithValue = (value: BigNumberish) => {
- const eventTopic = randomHex(32)
- const eventData = randomHex(120)
+ it('executes the intent', async () => {
+ const preUserBalance1 = await token1.balanceOf(user)
+ const preUserBalance2 = await token2.balanceOf(user)
+ const preRecipientBalance1 = await token1.balanceOf(recipient)
+ const preRecipientBalance2 = await token2.balanceOf(recipient)
+ const preSolverBalance = await token1.balanceOf(solver)
- beforeEach('create intent', async () => {
- intent = createCallIntent({
- settler,
- user,
- maxFees: [{ token: feeToken, amount: feeAmount }],
- calls: [{ target: target, data, value }],
- events: [{ topic: eventTopic, data: eventData }],
- })
- })
+ const proposal = createTransferProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- it('executes the intent', async () => {
- const preUserBalance = await balanceOf(feeToken, user)
- const preSolverBalance = await balanceOf(feeToken, solver)
- const preTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
-
- const proposal = createCallProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const postUserBalance = await balanceOf(feeToken, user)
- const postSolverBalance = await balanceOf(feeToken, solver)
- if (feeToken == NATIVE_TOKEN_ADDRESS) {
- const txReceipt = await (await tx.getTransaction())?.wait()
- const txCost = txReceipt ? txReceipt.gasUsed * txReceipt.gasPrice : 0n
- expect(preUserBalance - postUserBalance).to.be.eq(feeAmount + value)
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount - txCost)
- } else if (feeToken !== USD_ADDRESS) {
- expect(preUserBalance - postUserBalance).to.be.eq(feeAmount)
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
- }
+ const postUserBalance1 = await token1.balanceOf(user)
+ expect(preUserBalance1 - postUserBalance1).to.be.eq(amount1 + feeAmount)
- const postTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
- expect(postTargetBalance - preTargetBalance).to.be.eq(value)
- })
+ const postUserBalance2 = await token2.balanceOf(user)
+ expect(preUserBalance2 - postUserBalance2).to.be.eq(amount2)
- it('logs the intent events correctly', async () => {
- const proposal = createCallProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const events = await settler.queryFilter(settler.filters.IntentExecuted(), tx.blockNumber)
- expect(events).to.have.lengthOf(1)
-
- expect(events[0].args.user).to.be.equal(intent.user)
- expect(events[0].args.topic).to.be.equal(eventTopic)
- expect(events[0].args.op).to.be.equal(OpType.EvmCall)
- expect(events[0].args.intent).to.not.be.undefined
- expect(events[0].args.proposal).to.not.be.undefined
- expect(events[0].args.output).to.not.be.undefined
- expect(events[0].args.data).to.be.equal(eventData)
- })
- }
+ const postRecipientBalance1 = await token1.balanceOf(recipient)
+ expect(postRecipientBalance1 - preRecipientBalance1).to.be.eq(amount1)
- const itExecutesTheIntent = () => {
- context('when the value is 0', () => {
- const value = 0n
+ const postRecipientBalance2 = await token2.balanceOf(recipient)
+ expect(postRecipientBalance2 - preRecipientBalance2).to.be.eq(amount2)
- itExecutesTheIntentWithValue(value)
- })
+ const postSolverBalance = await token1.balanceOf(solver)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ })
+ })
+ })
- context('when the value is greater than 0', () => {
- const value = fp(0.00001)
+ context('call', () => {
+ context('single call', () => {
+ let target: Account, data: string
+ let user: SmartAccount
- beforeEach('fund smart account', async () => {
- await owner.sendTransaction({ to: user, value })
- })
+ beforeEach('deploy smart account', async () => {
+ user = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ })
- itExecutesTheIntentWithValue(value)
- })
- }
+ context('when the target is not the settler', () => {
+ let feeToken: TokenMock | string
- context('when the fee token is USD', () => {
- beforeEach('set fee token', async () => {
- feeToken = USD_ADDRESS
- })
+ const feeAmount = fp(0.01)
+
+ beforeEach('set target', async () => {
+ target = await ethers.deployContract('CallMock')
+ })
- itExecutesTheIntent()
+ context('when the call succeeds', () => {
+ beforeEach('set data', async () => {
+ data = target.interface.encodeFunctionData('call')
+ })
+
+ const itExecutesTheIntentWithValue = (value: BigNumberish) => {
+ const eventTopic = randomHex(32)
+ const eventData = randomHex(120)
+
+ beforeEach('create intent', async () => {
+ intent = createCallIntent(
+ {
+ settler,
+ feePayer: user,
+ maxFees: [{ token: feeToken, amount: feeAmount }],
+ },
+ {
+ user,
+ calls: [{ target: target, data, value }],
+ events: [{ topic: eventTopic, data: eventData }],
+ }
+ )
})
- context('when the fee token is an ERC20', () => {
- beforeEach('deploy token', async () => {
- feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
- })
+ it('executes the intent', async () => {
+ const preUserBalance = await balanceOf(feeToken, user)
+ const preSolverBalance = await balanceOf(feeToken, solver)
+ const preTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
- beforeEach('mint tokens', async () => {
- await feeToken.mint(user, feeAmount)
- })
+ const proposal = createCallProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const postUserBalance = await balanceOf(feeToken, user)
+ const postSolverBalance = await balanceOf(feeToken, solver)
+ if (feeToken == NATIVE_TOKEN_ADDRESS) {
+ const txReceipt = await (await tx.getTransaction())?.wait()
+ const txCost = txReceipt ? txReceipt.gasUsed * txReceipt.gasPrice : 0n
+ expect(preUserBalance - postUserBalance).to.be.eq(feeAmount + value)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount - txCost)
+ } else if (feeToken !== USD_ADDRESS) {
+ expect(preUserBalance - postUserBalance).to.be.eq(feeAmount)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ }
+
+ const postTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
+ expect(postTargetBalance - preTargetBalance).to.be.eq(value)
+ })
- itExecutesTheIntent()
+ it('logs the intent events correctly', async () => {
+ const proposal = createCallProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(1)
+
+ expect(events[0].args.user).to.be.equal(intent.operations[0].user)
+ expect(events[0].args.topic).to.be.equal(eventTopic)
+ expect(events[0].args.opType).to.be.equal(OpType.EvmCall)
+ expect(events[0].args.operation).to.not.be.undefined
+ expect(events[0].args.proposal).to.not.be.undefined
+ expect(events[0].args.intentHash).to.be.equal(hashIntent(intent))
+ expect(events[0].args.output).to.not.be.undefined
+ expect(events[0].args.data).to.be.equal(eventData)
})
+ }
- context('when the fee token is the native token', () => {
- beforeEach('set token', async () => {
- feeToken = NATIVE_TOKEN_ADDRESS
- })
+ const itExecutesTheIntent = () => {
+ context('when the value is 0', () => {
+ const value = 0n
+
+ itExecutesTheIntentWithValue(value)
+ })
+
+ context('when the value is greater than 0', () => {
+ const value = fp(0.00001)
beforeEach('fund smart account', async () => {
- await owner.sendTransaction({ to: user, value: feeAmount + BigInt(2) })
+ await owner.sendTransaction({ to: user, value })
})
- itExecutesTheIntent()
+ itExecutesTheIntentWithValue(value)
})
+ }
+
+ context('when the fee token is USD', () => {
+ beforeEach('set fee token', async () => {
+ feeToken = USD_ADDRESS
+ })
+
+ itExecutesTheIntent()
})
- context('when the call fails', () => {
- beforeEach('set data', async () => {
- data = target.interface.encodeFunctionData('callError')
+ context('when the fee token is an ERC20', () => {
+ beforeEach('deploy token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
})
- beforeEach('create intent', async () => {
- intent = createCallIntent({
- settler,
- user,
- maxFees: [{ token: feeToken, amount: feeAmount }],
- calls: [{ target: target, data, value: 0 }],
- })
+ beforeEach('mint tokens', async () => {
+ await feeToken.mint(user, feeAmount)
})
- it('reverts', async () => {
- const proposal = createCallProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
+ itExecutesTheIntent()
+ })
- await expect(settler.execute([{ intent, proposal, signature }])).to.be.revertedWithCustomError(
- target,
- 'CallError'
- )
+ context('when the fee token is the native token', () => {
+ beforeEach('set token', async () => {
+ feeToken = NATIVE_TOKEN_ADDRESS
})
- })
- })
- context('when the target is the settler', () => {
- beforeEach('set target', async () => {
- target = settler
- })
+ beforeEach('fund smart account', async () => {
+ await owner.sendTransaction({ to: user, value: feeAmount + BigInt(2) })
+ })
- beforeEach('allow user', async () => {
- await controller.connect(admin).setAllowedSolvers([user], [true])
+ itExecutesTheIntent()
})
+ })
+ context('when the call fails', () => {
beforeEach('set data', async () => {
- const intent = createCallIntent()
- const proposal = createCallProposal()
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const executions = [{ intent, proposal, signature }]
-
- data = settler.interface.encodeFunctionData('execute', [executions])
+ data = target.interface.encodeFunctionData('callError')
})
beforeEach('create intent', async () => {
- intent = createCallIntent({
- settler,
- user,
- calls: [{ target, data, value: 0 }],
- })
+ intent = createCallIntent(
+ {
+ settler,
+ feePayer: user,
+ maxFees: [{ token: feeToken, amount: feeAmount }],
+ },
+ {
+ user,
+ calls: [{ target: target, data, value: 0 }],
+ }
+ )
})
it('reverts', async () => {
- const proposal = createCallProposal()
+ const proposal = createCallProposal({ fees: [feeAmount] })
const signature = await signProposal(settler, intent, solver, proposal, admin)
- await expect(settler.execute([{ intent, proposal, signature }])).to.be.revertedWithCustomError(
- settler,
- 'ReentrancyGuardReentrantCall'
+ await expect(settler.execute(intent, proposal, signature)).to.be.revertedWithCustomError(
+ target,
+ 'CallError'
)
})
})
})
- context('multi call', () => {
- let target1: Account, target2: Account
- let data: string
- let user: SmartAccount
- let feeToken: TokenMock
-
- const value1 = fp(1)
- const value2 = fp(2)
- const feeAmount = fp(0.01)
-
- beforeEach('deploy smart account', async () => {
- user = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ context('when the target is the settler', () => {
+ beforeEach('set target', async () => {
+ target = settler
})
- beforeEach('set targets and data', async () => {
- target1 = await ethers.deployContract('CallMock')
- target2 = await ethers.deployContract('CallMock')
- data = target1.interface.encodeFunctionData('call')
+ beforeEach('allow user', async () => {
+ await controller.connect(admin).setAllowedSolvers([user], [true])
})
- beforeEach('deploy token', async () => {
- feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
+ beforeEach('set data', async () => {
+ const intent = createCallIntent()
+ const proposal = createCallProposal()
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+
+ data = settler.interface.encodeFunctionData('execute', [intent, proposal, signature])
})
- beforeEach('mint tokens', async () => {
- await feeToken.mint(user, feeAmount)
+ beforeEach('create intent', async () => {
+ intent = createCallIntent(
+ {
+ settler,
+ feePayer: user,
+ },
+ {
+ user,
+ calls: [{ target, data, value: 0 }],
+ }
+ )
})
- beforeEach('fund smart account', async () => {
- await owner.sendTransaction({ to: user, value: value1 + value2 })
+ it('reverts', async () => {
+ const proposal = createCallProposal()
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+
+ await expect(settler.execute(intent, proposal, signature)).to.be.revertedWithCustomError(
+ settler,
+ 'ReentrancyGuardReentrantCall'
+ )
})
+ })
+ })
- beforeEach('create intent', async () => {
- intent = createCallIntent({
+ context('multi call', () => {
+ let target1: Account, target2: Account
+ let data: string
+ let user: SmartAccount
+ let feeToken: TokenMock
+
+ const value1 = fp(1)
+ const value2 = fp(2)
+ const feeAmount = fp(0.01)
+
+ beforeEach('deploy smart account', async () => {
+ user = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ })
+
+ beforeEach('set targets and data', async () => {
+ target1 = await ethers.deployContract('CallMock')
+ target2 = await ethers.deployContract('CallMock')
+ data = target1.interface.encodeFunctionData('call')
+ })
+
+ beforeEach('deploy token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
+ })
+
+ beforeEach('mint tokens', async () => {
+ await feeToken.mint(user, feeAmount)
+ })
+
+ beforeEach('fund smart account', async () => {
+ await owner.sendTransaction({ to: user, value: value1 + value2 })
+ })
+
+ beforeEach('create intent', async () => {
+ intent = createCallIntent(
+ {
settler,
- user,
+ feePayer: user,
maxFees: [{ token: feeToken, amount: feeAmount }],
+ },
+ {
+ user,
calls: [
{ target: target1, data, value: value1 },
{ target: target2, data, value: value2 },
{ target: target2, data, value: 0 },
],
- })
- })
+ }
+ )
+ })
- it('executes the intent', async () => {
- const preUserBalance = await balanceOf(feeToken, user)
- const preSolverBalance = await balanceOf(feeToken, solver)
- const preTarget1Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target1)
- const preTarget2Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target2)
+ it('executes the intent', async () => {
+ const preUserBalance = await balanceOf(feeToken, user)
+ const preSolverBalance = await balanceOf(feeToken, solver)
+ const preTarget1Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target1)
+ const preTarget2Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target2)
- const proposal = createCallProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- await settler.execute([{ intent, proposal, signature }])
+ const proposal = createCallProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
- const postUserBalance = await balanceOf(feeToken, user)
- expect(preUserBalance - postUserBalance).to.be.eq(feeAmount)
+ const postUserBalance = await balanceOf(feeToken, user)
+ expect(preUserBalance - postUserBalance).to.be.eq(feeAmount)
- const postSolverBalance = await balanceOf(feeToken, solver)
- expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ const postSolverBalance = await balanceOf(feeToken, solver)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
- const postTarget1Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target1)
- expect(postTarget1Balance - preTarget1Balance).to.be.eq(value1)
+ const postTarget1Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target1)
+ expect(postTarget1Balance - preTarget1Balance).to.be.eq(value1)
- const postTarget2Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target2)
- expect(postTarget2Balance - preTarget2Balance).to.be.eq(value2)
- })
+ const postTarget2Balance = await balanceOf(NATIVE_TOKEN_ADDRESS, target2)
+ expect(postTarget2Balance - preTarget2Balance).to.be.eq(value2)
+ })
- it('calls the smart account contract', async () => {
- const proposal = createCallProposal({ fees: [feeAmount] })
- const signature = await signProposal(settler, intent, solver, proposal, admin)
- const tx = await settler.execute([{ intent, proposal, signature }])
-
- const events = await user.queryFilter(user.filters.Called(), tx.blockNumber)
- expect(events).to.have.lengthOf(3)
-
- const targets = [target1, target2, target2]
- const values = [value1, value2, 0]
- for (const [i, event] of events.entries()) {
- expect(event.args.target).to.equal(targets[i])
- expect(event.args.data).to.equal(data)
- expect(event.args.value).to.equal(values[i])
- expect(event.args.result).to.equal('0x')
- }
- })
+ it('calls the smart account contract', async () => {
+ const proposal = createCallProposal({ fees: [feeAmount] })
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await user.queryFilter(user.filters.Called(), tx.blockNumber)
+ expect(events).to.have.lengthOf(3)
+
+ const targets = [target1, target2, target2]
+ const values = [value1, value2, 0]
+ for (const [i, event] of events.entries()) {
+ expect(event.args.target).to.equal(targets[i])
+ expect(event.args.data).to.equal(data)
+ expect(event.args.value).to.equal(values[i])
+ expect(event.args.result).to.equal('0x')
+ }
})
})
})
- context('multi intent', () => {
- let transferIntent: Intent, swapIntent: Intent, callIntent: Intent
- let smartAccount: SmartAccount
- let weth: TokenMock
- let executor: TransferExecutorMock, target: Account
+ context('dynamic call', () => {
+ let user: SmartAccount
+ let target: Account
+ let feeToken: TokenMock
+ let proposal: Proposal
+
+ const arg0 = randomEvmAddress()
+ const arg1 = randomNumber(2)
+ const value = fp(0.00001)
+ const feeAmount = fp(0.01)
+ const eventTopic = randomHex(32)
+ const eventData = randomHex(120)
+
+ beforeEach('deploy contracts', async () => {
+ user = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ target = await ethers.deployContract('StaticCallMock')
+ feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
+ })
- const eth = NATIVE_TOKEN_ADDRESS
- const amount = fp(5)
- const feeAmount = fp(0.1)
- const value = fp(0.5)
+ beforeEach('mint tokens', async () => {
+ await feeToken.mint(user, feeAmount)
+ })
- beforeEach('set smart account', async () => {
- smartAccount = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ beforeEach('fund smart account', async () => {
+ await owner.sendTransaction({ to: user, value })
+ })
+
+ beforeEach('create intent', async () => {
+ intent = createDynamicCallIntent(
+ {
+ settler,
+ feePayer: user,
+ maxFees: [{ token: feeToken, amount: feeAmount }],
+ },
+ {
+ user,
+ calls: [
+ {
+ target,
+ selector: target.interface.getFunction('returnAddress')!.selector,
+ arguments: [literal(['address'], [arg0])],
+ value,
+ },
+ {
+ target,
+ selector: target.interface.getFunction('returnUint')!.selector,
+ arguments: [literal(['uint256'], [arg1])],
+ value: 0n,
+ },
+ ],
+ events: [{ topic: eventTopic, data: eventData }],
+ }
+ )
})
- beforeEach('set token', async () => {
- weth = await ethers.deployContract('TokenMock', ['WETH', 18])
+ beforeEach('create proposal', () => {
+ proposal = createDynamicCallProposal({ fees: [feeAmount] })
})
- beforeEach('set executor and target', async () => {
- executor = await ethers.deployContract('TransferExecutorMock')
- target = await ethers.deployContract('CallMock')
+ it('executes the intent', async () => {
+ const preUserBalance = await balanceOf(feeToken, user)
+ const preSolverBalance = await balanceOf(feeToken, solver)
+ const preTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
+
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
+
+ const postUserBalance = await balanceOf(feeToken, user)
+ expect(preUserBalance - postUserBalance).to.be.eq(feeAmount)
+
+ const postSolverBalance = await balanceOf(feeToken, solver)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+
+ const postTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
+ expect(postTargetBalance - preTargetBalance).to.be.eq(value)
})
- beforeEach('mint and approve tokens', async () => {
- await weth.mint(smartAccount, feeAmount)
- await weth.mint(user, amount + feeAmount)
- await weth.connect(user).approve(settler, amount + feeAmount)
+ it('logs the intent events correctly', async () => {
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(1)
+
+ expect(events[0].args.user).to.be.equal(intent.operations[0].user)
+ expect(events[0].args.topic).to.be.equal(eventTopic)
+ expect(events[0].args.opType).to.be.equal(OpType.EvmDynamicCall)
+ expect(events[0].args.intentHash).to.be.equal(hashIntent(intent))
+ expect(events[0].args.data).to.be.equal(eventData)
+
+ const [outputs] = AbiCoder.defaultAbiCoder().decode(['bytes[]'], events[0].args.output)
+ expect(outputs).to.have.lengthOf(2)
+
+ const [decodedA] = AbiCoder.defaultAbiCoder().decode(['address'], outputs[0])
+ expect(decodedA.toLowerCase()).to.be.equal(arg0)
+
+ const [decodedB] = AbiCoder.defaultAbiCoder().decode(['uint256'], outputs[1])
+ expect(decodedB).to.be.equal(arg1)
})
- beforeEach('fund executor', async () => {
- await owner.sendTransaction({ to: executor, value: amount })
+ it('reverts if the dynamic call references a later operation output', async () => {
+ intent.operations = [
+ createDynamicCallOperation({
+ user,
+ calls: [
+ {
+ target,
+ selector: target.interface.getFunction('returnUint')!.selector,
+ arguments: [variable(1, 0)],
+ },
+ ],
+ events: [{ topic: eventTopic, data: eventData }],
+ }),
+ createCallOperation({
+ user,
+ calls: [{ target, data: target.interface.encodeFunctionData('returnUint', [1n]) }],
+ }),
+ ]
+ proposal.datas = ['0x', '0x']
+
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await expect(settler.execute(intent, proposal, signature)).to.be.revertedWithCustomError(
+ dynamicCallEncoder,
+ 'DynamicCallEncoderVariableOutOfBounds'
+ )
})
+ })
- // Transfer WETH from user to smart account
- beforeEach('create transfer intent', async () => {
- transferIntent = createTransferIntent({
- settler,
+ context('swap + call + dynamic call + dynamic call', () => {
+ let smartAccount: SmartAccount
+ let tokenIn: TokenMock
+ let tokenOutA: TokenMock, tokenOutB: TokenMock
+ let executor: TransferExecutorMock
+ let target: Account
+ let proposal: Proposal
+
+ const chainId = 31337
+ const swapAmountIn = fp(1)
+ const swapAmountOutA = BigInt(2900 * 1e6)
+ const swapAmountOutB = BigInt(7 * 1e18)
+ const eventTopic = randomHex(32)
+ const eventData = randomHex(120)
+
+ beforeEach('deploy contracts', async () => {
+ smartAccount = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ tokenIn = await ethers.deployContract('TokenMock', ['WETH', 18])
+ tokenOutA = await ethers.deployContract('TokenMock', ['USDC', 6])
+ tokenOutB = await ethers.deployContract('TokenMock', ['DAI', 18])
+ executor = await ethers.deployContract('TransferExecutorMock')
+ target = await ethers.deployContract('StaticCallMock')
+ })
+
+ beforeEach('mint and approve tokens', async () => {
+ await tokenIn.mint(user, swapAmountIn)
+ await tokenIn.connect(user).approve(settler, swapAmountIn)
+ await tokenOutA.mint(executor, swapAmountOutA)
+ await tokenOutB.mint(executor, swapAmountOutB)
+ })
+
+ beforeEach('create intent', async () => {
+ const swapOperation = createSwapOperation({
user,
- transfers: [{ token: weth, amount, recipient: smartAccount }],
- maxFees: [{ token: weth, amount: feeAmount }],
+ sourceChain: chainId,
+ destinationChain: chainId,
+ tokensIn: { token: tokenIn, amount: swapAmountIn },
+ tokensOut: [
+ { token: tokenOutA, minAmount: swapAmountOutA, recipient: other },
+ { token: tokenOutB, minAmount: swapAmountOutB, recipient: other },
+ ],
})
- })
- // Swap WETH for ETH in smart account
- beforeEach('create swap intent', async () => {
- swapIntent = createSwapIntent({
- settler,
+ const callOperation = createCallOperation({
user: smartAccount,
- sourceChain: 31337,
- destinationChain: 31337,
- tokensIn: { token: weth, amount },
- tokensOut: { token: eth, minAmount: amount, recipient: smartAccount },
+ chainId,
+ calls: [{ target: tokenOutA, data: tokenOutA.interface.encodeFunctionData('decimals') }],
})
- })
- // Call with value from smart account
- beforeEach('create call intent', async () => {
- const data = target.interface.encodeFunctionData('call')
+ const dynamicCallOperation = createDynamicCallOperation({
+ user: smartAccount,
+ chainId,
+ calls: [
+ {
+ target,
+ selector: target.interface.getFunction('returnUint')!.selector,
+ arguments: [variable(0, 1)], // First operation, second output
+ },
+ {
+ target,
+ selector: target.interface.getFunction('returnUint')!.selector,
+ arguments: [variable(1, 0)], // Second operation, first output
+ },
+ ],
+ events: [{ topic: eventTopic, data: eventData }],
+ })
- callIntent = createCallIntent({
- settler,
+ const dynamicCallOperation2 = createDynamicCallOperation({
user: smartAccount,
- calls: [{ target, data, value }],
- maxFees: [{ token: eth, amount: feeAmount }],
+ chainId,
+ calls: [
+ {
+ target,
+ selector: target.interface.getFunction('returnStruct')!.selector,
+ arguments: [variable(2, 1), literal(['address'], [tokenOutA.target])], // Third operation, second output + literal
+ },
+ ],
+ events: [{ topic: eventTopic, data: eventData }],
+ })
+
+ intent = createIntent({
+ settler,
+ feePayer: user,
+ maxFees: [],
+ operations: [swapOperation, callOperation, dynamicCallOperation, dynamicCallOperation2],
})
})
- it('executes the intents', async () => {
- const preBalanceWethUser = await balanceOf(weth, user)
- const preBalanceEthSmartAccount = await balanceOf(eth, smartAccount)
+ beforeEach('create proposal', () => {
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [
+ [tokenOutA.target, tokenOutB.target],
+ [swapAmountOutA, swapAmountOutB],
+ ]
+ )
- const transferProposal = createTransferProposal({ fees: [feeAmount] })
- const transferSignature = await signProposal(settler, transferIntent, solver, transferProposal, admin)
+ proposal = createSwapProposal({
+ executor,
+ executorData,
+ amountsOut: [swapAmountOutA, swapAmountOutB],
+ })
+ proposal.datas = [...proposal.datas, '0x', '0x', '0x']
+ })
- const executorData = AbiCoder.defaultAbiCoder().encode(['address[]', 'uint256[]'], [[eth], [amount]])
- const swapProposal = createSwapProposal({ executor, executorData, amountsOut: amount })
- const swapSignature = await signProposal(settler, swapIntent, solver, swapProposal, admin)
+ it('passes the previous outputs into the dynamic calls', async () => {
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
- const callProposal = createCallProposal({ fees: [feeAmount] })
- const callSignature = await signProposal(settler, callIntent, solver, callProposal, admin)
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(2)
- const executions = [
- { intent: transferIntent, proposal: transferProposal, signature: transferSignature },
- { intent: swapIntent, proposal: swapProposal, signature: swapSignature },
- { intent: callIntent, proposal: callProposal, signature: callSignature },
- ]
+ // First dynamic call event
+ expect(events[0].args.opType).to.be.equal(OpType.EvmDynamicCall)
+ expect(events[0].args.topic).to.be.equal(eventTopic)
+ expect(events[0].args.data).to.be.equal(eventData)
+
+ const [outputs0] = AbiCoder.defaultAbiCoder().decode(['bytes[]'], events[0].args.output)
+ expect(outputs0).to.have.lengthOf(2)
- const tx = await settler.execute(executions)
+ const [decodedA] = AbiCoder.defaultAbiCoder().decode(['uint256'], outputs0[0])
+ expect(decodedA).to.be.equal(swapAmountOutB)
- const executorEvents = await executor.queryFilter(executor.filters.Transferred(), tx.blockNumber)
- expect(executorEvents).to.have.lengthOf(1)
+ const [decodedB] = AbiCoder.defaultAbiCoder().decode(['uint256'], outputs0[1])
+ expect(decodedB).to.be.equal(6n)
- const targetEvents = await target.queryFilter(target.filters.CallReceived(), tx.blockNumber)
- expect(targetEvents).to.have.lengthOf(1)
+ // Second dynamic call event
+ expect(events[1].args.opType).to.be.equal(OpType.EvmDynamicCall)
+ expect(events[1].args.topic).to.be.equal(eventTopic)
+ expect(events[1].args.data).to.be.equal(eventData)
- const settlerEvents = await settler.queryFilter(settler.filters.ProposalExecuted(), tx.blockNumber)
- expect(settlerEvents).to.have.lengthOf(3)
+ const [outputs1] = AbiCoder.defaultAbiCoder().decode(['bytes[]'], events[1].args.output)
+ expect(outputs1).to.have.lengthOf(1)
- const postBalanceWethUser = await balanceOf(weth, user)
- expect(preBalanceWethUser - postBalanceWethUser).to.be.eq(amount + feeAmount)
+ const [decodedStruct] = AbiCoder.defaultAbiCoder().decode(['tuple(uint256 a,address b)'], outputs1[0])
+ expect(decodedStruct.a).to.be.equal(6n)
+ expect(decodedStruct.b).to.be.equal(tokenOutA.target)
- const postBalanceEthSmartAccount = await balanceOf(eth, smartAccount)
- expect(postBalanceEthSmartAccount - preBalanceEthSmartAccount).to.be.eq(amount - value - feeAmount)
+ // All operations calls
+ const callEvents = await smartAccount.queryFilter(smartAccount.filters.Called(), tx.blockNumber)
+ expect(callEvents).to.have.lengthOf(4)
+
+ expect(callEvents[0].args.data).to.be.equal(tokenOutA.interface.encodeFunctionData('decimals'))
+ expect(callEvents[1].args.data).to.be.equal(
+ target.interface.encodeFunctionData('returnUint', [swapAmountOutB])
+ )
+ expect(callEvents[2].args.data).to.be.equal(target.interface.encodeFunctionData('returnUint', [6n]))
+ expect(callEvents[3].args.data).to.be.equal(
+ target.interface.encodeFunctionData('returnStruct', [[6n, tokenOutA.target]])
+ )
+ })
+ })
+
+ context('one of each', () => {
+ let target: Account, data: string
+ let smartAccount: SmartAccount
+ let feeToken: TokenMock
+ let proposal: Proposal
+ let executor: TransferExecutorMock
+ let tokenOut: TokenMock
+
+ const chainId = 31337
+
+ const callValue = fp(0.00001)
+ const feeAmount = fp(0.01)
+ const transferAmount = fp(0.5)
+ const swapAmountIn = fp(1) // WETH
+ const swapMinAmountOut = BigInt(2900 * 1e6) // USDC
+
+ beforeEach('deploy and mint token', async () => {
+ feeToken = await ethers.deployContract('TokenMock', ['WETH', 18])
+ await feeToken.mint(user, feeAmount)
+ })
+
+ beforeEach('prepare call operation', async () => {
+ smartAccount = await ethers.deployContract('SmartAccountContract', [settler, owner])
+ await owner.sendTransaction({ to: smartAccount, value: callValue })
+ target = await ethers.deployContract('CallMock')
+ data = target.interface.encodeFunctionData('call')
+ })
+
+ beforeEach('prepare swap operation', async () => {
+ executor = await ethers.deployContract('TransferExecutorMock')
+ tokenOut = await ethers.deployContract('TokenMock', ['USDC', 6])
+ await tokenOut.mint(executor, swapMinAmountOut)
+ await feeToken.mint(user, swapAmountIn)
+ })
+
+ beforeEach('approve token', async () => {
+ await feeToken.mint(user, transferAmount)
+ await feeToken.connect(user).approve(settler, feeAmount + transferAmount + swapAmountIn)
+ })
+
+ beforeEach('create intent', async () => {
+ const callOperation = createCallOperation({
+ user: smartAccount,
+ chainId,
+ calls: [{ target: target, data, value: callValue }],
+ events: [{ topic: randomHex(32), data: randomHex(120) }],
+ })
+
+ const transferOperation = createTransferOperation({
+ user,
+ chainId,
+ transfers: [{ token: feeToken, amount: transferAmount, recipient: other }],
+ events: [{ topic: randomHex(32), data: randomHex(120) }],
+ })
+
+ const swapOperation = createSwapOperation({
+ user,
+ sourceChain: chainId,
+ destinationChain: chainId,
+ tokensIn: { token: feeToken, amount: swapAmountIn },
+ tokensOut: { token: tokenOut, minAmount: swapMinAmountOut, recipient: other },
+ events: [{ topic: randomHex(32), data: randomHex(120) }],
+ })
+
+ intent = createIntent({
+ settler,
+ feePayer: user,
+ maxFees: [{ token: feeToken, amount: feeAmount }],
+ operations: [callOperation, transferOperation, swapOperation],
+ })
+ })
+
+ beforeEach('create proposal', () => {
+ const executorData = AbiCoder.defaultAbiCoder().encode(
+ ['address[]', 'uint256[]'],
+ [[tokenOut.target], [swapMinAmountOut]]
+ )
+ proposal = createSwapProposal({
+ fees: [feeAmount],
+ executor,
+ executorData,
+ amountsOut: [swapMinAmountOut],
+ })
+
+ proposal.datas = ['0x', '0x', ...proposal.datas]
+ })
+
+ it('executes the intent', async () => {
+ const preUserBalance = await balanceOf(feeToken, user)
+ const preSolverBalance = await balanceOf(feeToken, solver)
+ const preTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
+ const preOtherBalance = await balanceOf(feeToken, other)
+ const preOtherUSDCBalance = await balanceOf(tokenOut, other)
+
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ await settler.execute(intent, proposal, signature)
+
+ const postUserBalance = await balanceOf(feeToken, user)
+ const postSolverBalance = await balanceOf(feeToken, solver)
+ const postOtherBalance = await balanceOf(feeToken, other)
+ // intent fee
+ expect(preUserBalance - postUserBalance).to.be.eq(feeAmount + transferAmount + swapAmountIn)
+ expect(postSolverBalance - preSolverBalance).to.be.eq(feeAmount)
+ // transfer operation
+ expect(postOtherBalance - preOtherBalance).to.be.eq(transferAmount)
+ // call operation
+ const postTargetBalance = await balanceOf(NATIVE_TOKEN_ADDRESS, target)
+ expect(postTargetBalance - preTargetBalance).to.be.equal(callValue)
+ // swap operation
+ const postOtherUSDCBalance = await balanceOf(tokenOut, other)
+ expect(postOtherUSDCBalance - preOtherUSDCBalance).to.be.equal(swapMinAmountOut)
+ })
+
+ it('logs the intent events correctly', async () => {
+ const signature = await signProposal(settler, intent, solver, proposal, admin)
+ const tx = await settler.execute(intent, proposal, signature)
+
+ const events = await settler.queryFilter(settler.filters.OperationExecuted(), tx.blockNumber)
+ expect(events).to.have.lengthOf(3)
+ // checking correct order of events Call->Transfer->Swap
+ expect(events[0].args.opType).to.be.equal(OpType.EvmCall)
+ expect(events[1].args.opType).to.be.equal(OpType.Transfer)
+ expect(events[2].args.opType).to.be.equal(OpType.Swap)
})
})
})
@@ -2601,36 +3522,23 @@ describe('Settler', () => {
settler = settler.connect(solver)
})
- context('when there is a single intent', () => {
- it('reverts', async () => {
- const intent = createSwapIntent({ settler })
- const proposal = createSwapProposal({ executor: await ethers.deployContract('EmptyExecutorMock') })
- const fakeProposalSig = await Wallet.createRandom().signMessage(getBytes('0x'))
- const executions = [{ intent, proposal, signature: fakeProposalSig }]
-
- await expect(settler.simulate(executions)).to.be.revertedWithCustomError(settler, 'SettlerSimulationSuccess')
- })
- })
-
- context('when there are multiple intents', () => {
- it('reverts', async () => {
- const proposal = createSwapProposal({ executor: await ethers.deployContract('EmptyExecutorMock') })
- const fakeProposalSig = await Wallet.createRandom().signMessage(getBytes('0x'))
- const executions = [
- { intent: createSwapIntent({ settler }), proposal, signature: fakeProposalSig },
- { intent: createSwapIntent({ settler }), proposal, signature: fakeProposalSig },
- ]
-
- await expect(settler.simulate(executions)).to.be.revertedWithCustomError(settler, 'SettlerSimulationSuccess')
- })
+ it('reverts', async () => {
+ const intent = createSwapIntent({ settler })
+ const proposal = createSwapProposal({ executor: await ethers.deployContract('EmptyExecutorMock') })
+ const fakeProposalSig = await Wallet.createRandom().signMessage(getBytes('0x'))
+ await expect(settler.simulate(intent, proposal, fakeProposalSig)).to.be.revertedWithCustomError(
+ settler,
+ 'SettlerSimulationSuccess'
+ )
})
})
context('when the sender is not an allowed solver', () => {
it('reverts', async () => {
- const executions = [{ intent: createIntent(), proposal: createProposal(), signature: '0x' }]
-
- await expect(settler.simulate(executions)).to.be.revertedWithCustomError(settler, 'SettlerSolverNotAllowed')
+ await expect(settler.simulate(createIntent(), createProposal(), '0x')).to.be.revertedWithCustomError(
+ settler,
+ 'SettlerSolverNotAllowed'
+ )
})
})
})
@@ -2657,7 +3565,7 @@ describe('Settler', () => {
const proposal = createSwapProposal({ executor })
const signature = await signProposal(settler, intent, solver, proposal, admin)
- await expect(settler.execute([{ intent, proposal, signature }])).to.be.revertedWithCustomError(
+ await expect(settler.execute(intent, proposal, signature)).to.be.revertedWithCustomError(
settler,
'ReentrancyGuardReentrantCall'
)
diff --git a/packages/evm/test/behaviors/Upgradeable.behavior.ts b/packages/evm/test/behaviors/Upgradeable.behavior.ts
new file mode 100644
index 0000000..def8382
--- /dev/null
+++ b/packages/evm/test/behaviors/Upgradeable.behavior.ts
@@ -0,0 +1,62 @@
+import { HardhatEthers } from '@nomicfoundation/hardhat-ethers/types'
+import { expect } from 'chai'
+import { Contract, getAddress } from 'ethers'
+
+/* eslint-disable no-secrets/no-secrets */
+
+const ERC1967_ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'
+
+export default function itBehavesLikeUpgradeable(): void {
+ describe('initialize', () => {
+ it('locks the implementation initializer', async function () {
+ const implementation = await this.ethers.deployContract(this.implementationNameV1)
+
+ await expect(implementation.initialize(...this.initializeArgs)).to.be.revertedWithCustomError(
+ implementation,
+ 'InvalidInitialization'
+ )
+ })
+
+ it('cannot be initialized twice', async function () {
+ await expect(this.proxy.initialize(...this.initializeArgs)).to.be.revertedWithCustomError(
+ this.proxy,
+ 'InvalidInitialization'
+ )
+ })
+ })
+
+ describe('upgradeAndCall', () => {
+ context('when the sender is the owner', () => {
+ it('upgrades the implementation', async function () {
+ const proxyAdmin = await getProxyAdmin(this.ethers, this.proxy)
+ const newImplementation = await this.ethers.deployContract(this.implementationNameV2)
+
+ await proxyAdmin.connect(this.proxyOwner).upgradeAndCall(this.proxy, newImplementation, '0x')
+ await this.assertUpgrade(this.proxy)
+ })
+ })
+
+ context('when the sender is not the owner', () => {
+ it('reverts', async function () {
+ const proxyAdmin = await getProxyAdmin(this.ethers, this.proxy)
+ const newImplementation = await this.ethers.deployContract(this.implementationNameV2)
+
+ await expect(
+ proxyAdmin.connect(this.other).upgradeAndCall(this.proxy, newImplementation, '0x')
+ ).to.be.revertedWithCustomError(proxyAdmin, 'OwnableUnauthorizedAccount')
+ })
+ })
+ })
+}
+
+async function getProxyAdmin(ethers: HardhatEthers, proxy: Contract): Promise {
+ const rawAdmin = await ethers.provider.getStorage(proxy.target as string, ERC1967_ADMIN_SLOT)
+ return new Contract(
+ getAddress(`0x${rawAdmin.slice(-40)}`),
+ [
+ 'error OwnableUnauthorizedAccount(address account)',
+ 'function upgradeAndCall(address proxy, address implementation, bytes data) payable',
+ ],
+ ethers.provider
+ )
+}
diff --git a/packages/evm/test/dynamic-calls/DynamicCallEncoder.test.ts b/packages/evm/test/dynamic-calls/DynamicCallEncoder.test.ts
new file mode 100644
index 0000000..f0c1689
--- /dev/null
+++ b/packages/evm/test/dynamic-calls/DynamicCallEncoder.test.ts
@@ -0,0 +1,286 @@
+import { randomEvmAddress } from '@mimicprotocol/sdk'
+import { expect } from 'chai'
+import { network } from 'hardhat'
+
+import { DynamicCallEncoder } from '../../types/ethers-contracts/index.js'
+import { DynamicArg, literal, variable } from '../helpers'
+
+const { ethers } = await network.connect()
+
+/* eslint-disable no-secrets/no-secrets */
+/* eslint-disable @typescript-eslint/no-non-null-assertion */
+
+describe('DynamicCallEncoder', () => {
+ let encoder: DynamicCallEncoder
+
+ beforeEach('deploy contract', async () => {
+ encoder = await ethers.deployContract('DynamicCallEncoder')
+ })
+
+ const iface = new ethers.Interface([
+ 'function balanceOf(address) view returns (uint256)',
+ 'function transfer(address,uint256) returns (bool)',
+ 'function foo(uint256[])',
+ 'function number(uint256 value) view returns (uint256)',
+ 'function bar(uint256[2])',
+ 'function baz((uint256,address))',
+ 'function qux(uint256,uint256[2])',
+ 'function nested((uint256[],uint256[2],(address,uint256)[])[])',
+ ])
+
+ function dynamicCall(method: string, args: DynamicArg[]) {
+ return {
+ target: randomEvmAddress(),
+ value: 0n,
+ selector: iface.getFunction(method)!.selector,
+ arguments: args,
+ }
+ }
+
+ describe('encode', () => {
+ context('with literal arguments', () => {
+ const variables: string[][] = []
+
+ context('with a single argument', () => {
+ const owner = randomEvmAddress()
+ const call = dynamicCall('balanceOf', [literal(['address'], [owner])])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('balanceOf', [owner]))
+ })
+ })
+
+ context('with multiple arguments', () => {
+ const to = randomEvmAddress()
+ const amount = 999n
+ const call = dynamicCall('transfer', [literal(['address'], [to]), literal(['uint256'], [amount])])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('transfer', [to, amount]))
+ })
+ })
+
+ context('with arbitrary-length arguments', () => {
+ const values = [1n, 2n, 3n]
+ const call = dynamicCall('foo', [literal(['uint256[]'], [values], true)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('foo', [values]))
+ })
+ })
+
+ context('when a static uint256 equals an ABI dynamic offset', () => {
+ const value = 96n
+ const call = dynamicCall('number', [literal(['uint256'], [value])])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('number', [value]))
+ })
+ })
+
+ context('when a static address equals an ABI dynamic offset', () => {
+ const value = '0x0000000000000000000000000000000000000060'
+ const call = dynamicCall('balanceOf', [literal(['address'], [value])])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('balanceOf', [value]))
+ })
+ })
+
+ context('with an array of structs containing nested arrays', () => {
+ const values = [
+ [
+ [1n, 2n, 3n],
+ [4n, 5n],
+ [
+ [randomEvmAddress(), 6n],
+ [randomEvmAddress(), 7n],
+ ],
+ ],
+ [[8n, 9n], [10n, 11n], [[randomEvmAddress(), 12n]]],
+ ]
+ const call = dynamicCall('nested', [
+ literal(['tuple(uint256[],uint256[2],tuple(address,uint256)[])[]'], [values], true),
+ ])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('nested', [values]))
+ })
+ })
+ })
+
+ context('with variable arguments', () => {
+ context('when the variable spec is correct', () => {
+ const var0 = 100n
+ const var1 = randomEvmAddress()
+ const var2 = [1, 2, 3, 4, 5, 6, 7]
+ const var3 = [11n, 22n]
+ const var4 = [33n, randomEvmAddress()]
+ const var5 = [32n, 99n]
+ const var6 = [
+ [
+ [1n, 2n, 3n],
+ [4n, 5n],
+ [
+ [randomEvmAddress(), 6n],
+ [randomEvmAddress(), 7n],
+ ],
+ ],
+ [[], [10n, 11n], [[randomEvmAddress(), 12n]]],
+ ]
+
+ // variables[opIndex][subIndex]
+ const variables = [
+ [
+ ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [var0]),
+ ethers.AbiCoder.defaultAbiCoder().encode(['address'], [var1]),
+ ],
+ [
+ ethers.AbiCoder.defaultAbiCoder().encode(['uint256[]'], [var2]),
+ ethers.AbiCoder.defaultAbiCoder().encode(['uint256[2]'], [var3]),
+ ethers.AbiCoder.defaultAbiCoder().encode(['tuple(uint256,address)'], [var4]),
+ ethers.AbiCoder.defaultAbiCoder().encode(['uint256[2]'], [var5]),
+ ethers.AbiCoder.defaultAbiCoder().encode(
+ ['tuple(uint256[],uint256[2],tuple(address,uint256)[])[]'],
+ [var6]
+ ),
+ ],
+ ]
+
+ context('with a single argument', () => {
+ const call = dynamicCall('balanceOf', [variable(0, 1)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('balanceOf', [var1]))
+ })
+ })
+
+ context('with multiple arguments', () => {
+ const to = randomEvmAddress()
+ const call = dynamicCall('transfer', [literal(['address'], [to]), variable(0, 0)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('transfer', [to, var0]))
+ })
+ })
+
+ context('with arbitrary-length arguments', () => {
+ const call = dynamicCall('foo', [variable(1, 0, true)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('foo', [var2]))
+ })
+ })
+
+ context('with multi-word static arguments', () => {
+ const call = dynamicCall('bar', [variable(1, 1)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('bar', [var3]))
+ })
+ })
+
+ context('with static tuple arguments', () => {
+ const call = dynamicCall('baz', [variable(1, 2)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('baz', [var4]))
+ })
+ })
+
+ context('when a static value starts with an ABI dynamic offset', () => {
+ const value = 1n
+ const call = dynamicCall('qux', [literal(['uint256'], [value]), variable(1, 3)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('qux', [value, var5]))
+ })
+ })
+
+ context('with an array of structs containing nested arrays', () => {
+ const call = dynamicCall('nested', [variable(1, 4, true)])
+
+ it('encodes arguments properly', async () => {
+ const encoded = await encoder.encode(call, variables, variables.length)
+ expect(encoded).to.equal(iface.encodeFunctionData('nested', [var6]))
+ })
+ })
+ })
+
+ context('when the variable spec is invalid', () => {
+ context('when variable ref is not 64 bytes', () => {
+ const call = dynamicCall('foo', [{ kind: 1, data: '0x11', isDynamic: false }])
+
+ it('reverts with DynamicCallEncoderVariableRefBadLength', async () => {
+ await expect(encoder.encode(call, [], 0)).to.be.revertedWithCustomError(
+ encoder,
+ 'DynamicCallEncoderVariableRefBadLength'
+ )
+ })
+ })
+
+ context('when operation index is out of bounds', () => {
+ const var0 = [ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [1n])]
+ const variables = [var0, var0] // variables.length = 2
+ const variablesLength = 1
+ const call = dynamicCall('foo', [variable(1, 0)])
+
+ it('reverts with DynamicCallEncoderVariableOutOfBounds', async () => {
+ await expect(encoder.encode(call, variables, variablesLength)).to.be.revertedWithCustomError(
+ encoder,
+ 'DynamicCallEncoderVariableOutOfBounds'
+ )
+ })
+ })
+
+ context('when sub-index is out of bounds', () => {
+ const variables = [[ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [1n])]]
+ const call = dynamicCall('foo', [variable(0, 1)])
+
+ it('reverts with DynamicCallEncoderVariableOutOfBounds', async () => {
+ await expect(encoder.encode(call, variables, variables.length)).to.be.revertedWithCustomError(
+ encoder,
+ 'DynamicCallEncoderVariableOutOfBounds'
+ )
+ })
+ })
+
+ context('when variable bytes are not word-aligned', () => {
+ const variables = [['0x1234']]
+ const call = dynamicCall('transfer', [literal(['address'], [randomEvmAddress()]), variable(0, 0)])
+
+ it('reverts with DynamicCallEncoderBadLength', async () => {
+ await expect(encoder.encode(call, variables, variables.length)).to.be.revertedWithCustomError(
+ encoder,
+ 'DynamicCallEncoderBadLength'
+ )
+ })
+ })
+ })
+ })
+
+ context('when variables length exceeds the variables array length', () => {
+ const variables = [[ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [1n])]]
+ const call = dynamicCall('foo', [variable(0, 0)])
+
+ it('reverts with DynamicCallEncoderVariablesLengthOutOfBounds', async () => {
+ await expect(encoder.encode(call, variables, variables.length + 1)).to.be.revertedWithCustomError(
+ encoder,
+ 'DynamicCallEncoderVariablesLengthOutOfBounds'
+ )
+ })
+ })
+ })
+})
diff --git a/packages/evm/test/helpers/dynamic-calls.ts b/packages/evm/test/helpers/dynamic-calls.ts
new file mode 100644
index 0000000..9170601
--- /dev/null
+++ b/packages/evm/test/helpers/dynamic-calls.ts
@@ -0,0 +1,14 @@
+import { AbiCoder } from 'ethers'
+
+export type DynamicArg = { kind: number; data: string; isDynamic: boolean }
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+export function literal(types: string[], values: any[], isDynamic = false): DynamicArg {
+ const data = AbiCoder.defaultAbiCoder().encode(types, values)
+ return { kind: 0, data, isDynamic }
+}
+
+export function variable(opIndex: number, subIndex: number, isDynamic = false): DynamicArg {
+ const data = AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256'], [opIndex, subIndex])
+ return { kind: 1, data, isDynamic }
+}
diff --git a/packages/evm/test/helpers/index.ts b/packages/evm/test/helpers/index.ts
index 43b47ac..51366da 100644
--- a/packages/evm/test/helpers/index.ts
+++ b/packages/evm/test/helpers/index.ts
@@ -1,6 +1,8 @@
export * from './addresses'
export * from './arrays'
+export * from './dynamic-calls.js'
export * from './intents'
export * from './proposal'
+export * from './proxy'
export * from './safeguards'
export * from './time'
diff --git a/packages/evm/test/helpers/intents/base.ts b/packages/evm/test/helpers/intents/base.ts
index 454a90f..cc30185 100644
--- a/packages/evm/test/helpers/intents/base.ts
+++ b/packages/evm/test/helpers/intents/base.ts
@@ -16,60 +16,79 @@ export type MaxFee = {
amount: BigNumberish
}
-export type IntentEvent = {
+export type OperationEvent = {
topic: string
data?: string
}
+export type Operation = {
+ opType: OpType
+ user: Account
+ data: string
+ events: OperationEvent[]
+}
+
export type Intent = {
- op: OpType
settler: Account
- user: Account
+ feePayer: Account
nonce: string
deadline: BigNumberish
- data: string
maxFees: MaxFee[]
- events: IntentEvent[]
- configSig: string
+ triggerSig: string
minValidations: number
validations: string[]
+ operations: Operation[]
}
export function createIntent(params?: Partial): Intent {
return { ...getDefaults(), ...params }
}
+export function createOperation(params?: Partial): Operation {
+ return { ...getOperationDefaults(), ...params }
+}
+
export function hashIntent(intent: Intent): string {
return hashRawIntent(toRawIntent(intent))
}
function toRawIntent(intent: Intent): RawIntent {
return {
- op: intent.op,
- user: toAddress(intent.user),
+ feePayer: toAddress(intent.feePayer),
settler: toAddress(intent.settler),
nonce: intent.nonce.toString(),
deadline: intent.deadline.toString(),
- data: intent.data,
maxFees: intent.maxFees.map(({ token, amount }) => ({ token: toAddress(token), amount: amount.toString() })),
- events: intent.events.map(({ topic, data }) => ({ topic, data: data || '0x' })),
- configSig: intent.configSig,
+ triggerSig: intent.triggerSig,
minValidations: intent.minValidations,
+ operations: intent.operations.map(({ opType, user, data, events }) => ({
+ opType,
+ user: toAddress(user),
+ data,
+ events: events.map(({ topic, data }) => ({ topic, data: data || '0x' })),
+ })),
+ }
+}
+
+function getOperationDefaults(): Operation {
+ return {
+ opType: OpType.Transfer,
+ user: randomEvmAddress(),
+ data: '0x',
+ events: [],
}
}
function getDefaults(): Intent {
return {
- op: OpType.Transfer,
settler: randomEvmAddress(),
- user: randomEvmAddress(),
+ feePayer: randomEvmAddress(),
nonce: randomHex(32),
deadline: MAX_UINT256,
- data: '0x',
maxFees: [],
- events: [],
- configSig: randomSig(),
+ triggerSig: randomSig(),
minValidations: 0,
validations: [],
+ operations: [getOperationDefaults()],
}
}
diff --git a/packages/evm/test/helpers/intents/call.ts b/packages/evm/test/helpers/intents/call.ts
index f6d1370..a313480 100644
--- a/packages/evm/test/helpers/intents/call.ts
+++ b/packages/evm/test/helpers/intents/call.ts
@@ -1,10 +1,15 @@
-import { BigNumberish, CallIntentData, encodeEvmCallIntent, OpType } from '@mimicprotocol/sdk'
+import {
+ BigNumberish,
+ encodeEvmCallOperation,
+ EvmCallOperationData as CallOperationData,
+ OpType,
+} from '@mimicprotocol/sdk'
-import { Account, toAddress } from '../addresses'
-import { NAry, toArray } from '../arrays'
-import { createIntent, Intent } from './base'
+import { Account, toAddress } from '../addresses.js'
+import { NAry, toArray } from '../arrays.js'
+import { createIntent, createOperation, Intent, Operation } from './base.js'
-export type CallIntent = Intent & {
+export type CallOperation = Operation & {
chainId: BigNumberish
calls: NAry
}
@@ -15,16 +20,23 @@ export interface CallData {
value?: BigNumberish
}
-export function createCallIntent(params?: Partial): Intent {
- const intent = createIntent({ ...params, op: OpType.EvmCall })
- const callIntent = { ...getDefaults(), ...params, ...intent } as CallIntent
- intent.data = encodeEvmCallIntent(toCallIntentData(callIntent))
+export function createCallIntent(intentParams?: Partial, operationParams?: Partial): Intent {
+ const intent = createIntent({ ...intentParams })
+ const operation = createCallOperation({ ...operationParams })
+ intent.operations = [operation]
return intent
}
-function toCallIntentData(intent: CallIntent): CallIntentData {
+export function createCallOperation(params?: Partial): Operation {
+ const operation = createOperation({ ...params, opType: OpType.EvmCall })
+ const callOperation = { ...getDefaults(), ...params, ...operation } as CallOperation
+ operation.data = encodeEvmCallOperation(toCallOperationData(callOperation))
+ return operation
+}
+
+function toCallOperationData(intent: CallOperation): CallOperationData {
return {
- chainId: intent.chainId,
+ chainId: Number(intent.chainId.toString()),
calls: toArray(intent.calls).map((callData: CallData) => ({
target: toAddress(callData.target),
data: callData.data || '0x',
@@ -33,7 +45,7 @@ function toCallIntentData(intent: CallIntent): CallIntentData {
}
}
-function getDefaults(): Partial {
+function getDefaults(): Partial {
return {
chainId: 31337,
calls: [],
diff --git a/packages/evm/test/helpers/intents/dynamic-call.ts b/packages/evm/test/helpers/intents/dynamic-call.ts
new file mode 100644
index 0000000..30921c2
--- /dev/null
+++ b/packages/evm/test/helpers/intents/dynamic-call.ts
@@ -0,0 +1,68 @@
+import { OpType } from '@mimicprotocol/sdk'
+import { AbiCoder, BigNumberish } from 'ethers'
+
+import { Account, toAddress } from '../addresses.js'
+import { DynamicArg } from '../dynamic-calls.js'
+import { createIntent, createOperation, Intent, Operation } from './base.js'
+
+export type DynamicCallOperation = Operation & {
+ chainId: BigNumberish
+ calls: DynamicCallData[]
+}
+
+export interface DynamicCallData {
+ target: Account
+ value?: BigNumberish
+ selector: string
+ arguments: DynamicArg[]
+}
+
+export function createDynamicCallIntent(
+ intentParams?: Partial,
+ operationParams?: Partial
+): Intent {
+ const intent = createIntent({ ...intentParams })
+ const operation = createDynamicCallOperation({ ...operationParams })
+ intent.operations = [operation]
+ return intent
+}
+
+export function createDynamicCallOperation(params?: Partial): Operation {
+ const operation = createOperation({ ...params, opType: OpType.EvmDynamicCall })
+ const dynamicCallOperation = { ...getDefaults(), ...params, ...operation } as DynamicCallOperation
+ operation.data = AbiCoder.defaultAbiCoder().encode(
+ ['tuple(uint256 chainId, bytes[] calls)'],
+ [toDynamicCallOperationData(dynamicCallOperation)]
+ )
+ return operation
+}
+
+function toDynamicCallOperationData(operation: DynamicCallOperation) {
+ return {
+ chainId: operation.chainId.toString(),
+ calls: operation.calls.map((call) => encodeDynamicCallData(call)),
+ }
+}
+
+function getDefaults(): Partial {
+ return {
+ chainId: 31337,
+ calls: [],
+ }
+}
+
+function encodeDynamicCallData(call: DynamicCallData): string {
+ return AbiCoder.defaultAbiCoder().encode(
+ [
+ 'tuple(address target, uint256 value, bytes4 selector, tuple(uint8 kind, bytes data, bool isDynamic)[] arguments)',
+ ],
+ [
+ {
+ target: toAddress(call.target),
+ value: (call.value || 0).toString(),
+ selector: call.selector,
+ arguments: call.arguments,
+ },
+ ]
+ )
+}
diff --git a/packages/evm/test/helpers/intents/index.ts b/packages/evm/test/helpers/intents/index.ts
index 6f7df96..3e9bc08 100644
--- a/packages/evm/test/helpers/intents/index.ts
+++ b/packages/evm/test/helpers/intents/index.ts
@@ -1,4 +1,5 @@
export * from './base'
export * from './call'
+export * from './dynamic-call'
export * from './swap'
export * from './transfer'
diff --git a/packages/evm/test/helpers/intents/swap.ts b/packages/evm/test/helpers/intents/swap.ts
index fe5b634..d0fe74d 100644
--- a/packages/evm/test/helpers/intents/swap.ts
+++ b/packages/evm/test/helpers/intents/swap.ts
@@ -1,10 +1,10 @@
-import { BigNumberish, encodeSwapIntent, OpType, SwapIntentData } from '@mimicprotocol/sdk'
+import { BigNumberish, encodeSwapOperation, OpType, SwapOperationData } from '@mimicprotocol/sdk'
-import { Account, toAddress } from '../addresses'
-import { NAry, toArray } from '../arrays'
-import { createIntent, Intent } from './base'
+import { Account, toAddress } from '../addresses.js'
+import { NAry, toArray } from '../arrays.js'
+import { createIntent, createOperation, Intent, Operation } from './base.js'
-export type SwapIntent = Intent & {
+export type SwapOperation = Operation & {
sourceChain: number
destinationChain: number
tokensIn: NAry
@@ -22,22 +22,46 @@ export interface TokenOut {
recipient: Account
}
-export function createSwapIntent(params?: Partial): Intent {
- const intent = createIntent({ ...params, op: OpType.Swap })
- const swapIntent = { ...getDefaults(), ...params, ...intent } as SwapIntent
- intent.data = encodeSwapIntent(toSwapIntentData(swapIntent))
+export function createSwapIntent(intentParams?: Partial, operationParams?: Partial): Intent {
+ const intent = createIntent({ ...intentParams })
+ const operation = createSwapOperation({ ...operationParams })
+ intent.operations = [operation]
return intent
}
-function toSwapIntentData(intent: SwapIntent): SwapIntentData {
+export function createCrossChainSwapIntent(
+ intentParams?: Partial,
+ operationParams?: Partial
+): Intent {
+ const intent = createIntent({ ...intentParams })
+ const operation = createCrossChainSwapOperation({ ...operationParams })
+ intent.operations = [operation]
+ return intent
+}
+
+export function createSwapOperation(params?: Partial): Operation {
+ const operation = createOperation({ ...params, opType: OpType.Swap })
+ const swapOperation = { ...getDefaults(), ...params, ...operation } as SwapOperation
+ operation.data = encodeSwapOperation(toSwapOperationData(swapOperation))
+ return operation
+}
+
+export function createCrossChainSwapOperation(params?: Partial): Operation {
+ const operation = createOperation({ ...params, opType: OpType.CrossChainSwap })
+ const swapOperation = { ...getCrossChainDefaults(), ...params, ...operation } as SwapOperation
+ operation.data = encodeSwapOperation(toSwapOperationData(swapOperation))
+ return operation
+}
+
+function toSwapOperationData(operation: SwapOperation): SwapOperationData {
return {
- sourceChain: intent.sourceChain.toString(),
- destinationChain: intent.destinationChain.toString(),
- tokensIn: toArray(intent.tokensIn).map(({ token, amount }) => ({
+ sourceChain: operation.sourceChain,
+ destinationChain: operation.destinationChain,
+ tokensIn: toArray(operation.tokensIn).map(({ token, amount }) => ({
token: toAddress(token),
amount: amount.toString(),
})),
- tokensOut: toArray(intent.tokensOut).map(({ token, minAmount, recipient }) => ({
+ tokensOut: toArray(operation.tokensOut).map(({ token, minAmount, recipient }) => ({
token: toAddress(token),
minAmount: minAmount.toString(),
recipient: toAddress(recipient),
@@ -45,7 +69,7 @@ function toSwapIntentData(intent: SwapIntent): SwapIntentData {
}
}
-function getDefaults(): Partial {
+function getDefaults(): Partial {
return {
sourceChain: 31337,
destinationChain: 31337,
@@ -53,3 +77,10 @@ function getDefaults(): Partial {
tokensOut: [],
}
}
+
+function getCrossChainDefaults(): Partial {
+ return {
+ ...getDefaults(),
+ destinationChain: 1,
+ }
+}
diff --git a/packages/evm/test/helpers/intents/transfer.ts b/packages/evm/test/helpers/intents/transfer.ts
index e87e9b2..8ec77cf 100644
--- a/packages/evm/test/helpers/intents/transfer.ts
+++ b/packages/evm/test/helpers/intents/transfer.ts
@@ -1,10 +1,10 @@
-import { BigNumberish, encodeTransferIntent, OpType, TransferIntentData } from '@mimicprotocol/sdk'
+import { BigNumberish, encodeTransferOperation, OpType, TransferOperationData } from '@mimicprotocol/sdk'
-import { Account, toAddress } from '../addresses'
-import { NAry, toArray } from '../arrays'
-import { createIntent, Intent } from './base'
+import { Account, toAddress } from '../addresses.js'
+import { NAry, toArray } from '../arrays.js'
+import { createIntent, createOperation, Intent, Operation } from './base.js'
-export type TransferIntent = Intent & {
+export type TransferOperation = Operation & {
chainId: BigNumberish
transfers: NAry
}
@@ -15,16 +15,26 @@ export interface TransferData {
recipient: Account
}
-export function createTransferIntent(params?: Partial): Intent {
- const intent = createIntent({ ...params, op: OpType.Transfer })
- const transferIntent = { ...getDefaults(), ...params, ...intent } as TransferIntent
- intent.data = encodeTransferIntent(toTransferIntentData(transferIntent))
+export function createTransferIntent(
+ intentParams?: Partial,
+ operationParams?: Partial
+): Intent {
+ const intent = createIntent({ ...intentParams })
+ const operation = createTransferOperation({ ...operationParams })
+ intent.operations = [operation]
return intent
}
-function toTransferIntentData(intent: TransferIntent): TransferIntentData {
+export function createTransferOperation(params?: Partial): Operation {
+ const operation = createOperation({ ...params, opType: OpType.Transfer })
+ const transferOperation = { ...getDefaults(), ...params, ...operation } as TransferOperation
+ operation.data = encodeTransferOperation(toTransferOperationData(transferOperation))
+ return operation
+}
+
+function toTransferOperationData(intent: TransferOperation): TransferOperationData {
return {
- chainId: intent.chainId.toString(),
+ chainId: Number(intent.chainId.toString()),
transfers: toArray(intent.transfers).map((transfer) => ({
token: toAddress(transfer.token),
amount: transfer.amount.toString(),
@@ -33,7 +43,7 @@ function toTransferIntentData(intent: TransferIntent): TransferIntentData {
}
}
-function getDefaults(): Partial {
+function getDefaults(): Partial {
return {
chainId: 31337,
transfers: [],
diff --git a/packages/evm/test/helpers/proposal/base.ts b/packages/evm/test/helpers/proposal/base.ts
index 844e7ae..fbd2458 100644
--- a/packages/evm/test/helpers/proposal/base.ts
+++ b/packages/evm/test/helpers/proposal/base.ts
@@ -10,13 +10,13 @@ import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/types'
import { Contract } from 'ethers'
import { network } from 'hardhat'
-import { Account, toAddress } from '../addresses'
-import { toArray } from '../arrays'
+import { Account, toAddress } from '../addresses.js'
+import { toArray } from '../arrays.js'
import { hashIntent, Intent } from '../intents'
export type Proposal = {
deadline: BigNumberish
- data: string
+ datas: string[]
fees: BigNumberish[]
}
@@ -34,7 +34,7 @@ export async function signProposal(
intent: hashIntent(intent),
solver: toAddress(solver),
deadline: proposal.deadline,
- data: proposal.data,
+ datas: proposal.datas,
fees: proposal.fees,
})
}
@@ -51,7 +51,7 @@ export function toRawProposal(proposal: Proposal, solver: Account): RawProposal
return {
solver: toAddress(solver),
deadline: proposal.deadline.toString(),
- data: proposal.data,
+ datas: proposal.datas,
fees: toArray(proposal.fees).map((fee) => fee.toString()),
}
}
@@ -59,7 +59,7 @@ export function toRawProposal(proposal: Proposal, solver: Account): RawProposal
function getDefaults(): Proposal {
return {
deadline: MAX_UINT256,
- data: '0x',
+ datas: ['0x'],
fees: [],
}
}
diff --git a/packages/evm/test/helpers/proposal/dynamic-call.ts b/packages/evm/test/helpers/proposal/dynamic-call.ts
new file mode 100644
index 0000000..9529d59
--- /dev/null
+++ b/packages/evm/test/helpers/proposal/dynamic-call.ts
@@ -0,0 +1,5 @@
+import { createProposal, Proposal } from './base'
+
+export function createDynamicCallProposal(params?: Partial): Proposal {
+ return createProposal(params)
+}
diff --git a/packages/evm/test/helpers/proposal/index.ts b/packages/evm/test/helpers/proposal/index.ts
index 6f7df96..3e9bc08 100644
--- a/packages/evm/test/helpers/proposal/index.ts
+++ b/packages/evm/test/helpers/proposal/index.ts
@@ -1,4 +1,5 @@
export * from './base'
export * from './call'
+export * from './dynamic-call'
export * from './swap'
export * from './transfer'
diff --git a/packages/evm/test/helpers/proposal/swap.ts b/packages/evm/test/helpers/proposal/swap.ts
index 93c3bc8..c7e7251 100644
--- a/packages/evm/test/helpers/proposal/swap.ts
+++ b/packages/evm/test/helpers/proposal/swap.ts
@@ -1,8 +1,8 @@
import { BigNumberish, encodeSwapProposal, randomEvmAddress, SwapProposalData } from '@mimicprotocol/sdk'
-import { Account, toAddress } from '../addresses'
-import { NAry, toArray } from '../arrays'
-import { createProposal, Proposal } from './base'
+import { Account, toAddress } from '../addresses.js'
+import { NAry, toArray } from '../arrays.js'
+import { createProposal, Proposal } from './base.js'
export type SwapProposal = Proposal & {
executor: Account
@@ -13,7 +13,7 @@ export type SwapProposal = Proposal & {
export function createSwapProposal(params?: Partial): Proposal {
const proposal = createProposal(params)
const swapProposal = { ...getDefaults(), ...params, ...proposal } as SwapProposal
- proposal.data = encodeSwapProposal(toSwapProposalData(swapProposal))
+ proposal.datas = [encodeSwapProposal(toSwapProposalData(swapProposal))]
return proposal
}
diff --git a/packages/evm/test/helpers/proxy.ts b/packages/evm/test/helpers/proxy.ts
new file mode 100644
index 0000000..ac13d20
--- /dev/null
+++ b/packages/evm/test/helpers/proxy.ts
@@ -0,0 +1,16 @@
+import { HardhatEthers } from '@nomicfoundation/hardhat-ethers/types'
+import { Contract } from 'ethers'
+
+import { Account, toAddress } from './addresses.js'
+
+export async function deployProxy(
+ ethers: HardhatEthers,
+ implementationName: string,
+ initialOwner: Account,
+ initializeArgs: unknown[]
+): Promise {
+ const implementation = await ethers.deployContract(implementationName)
+ const initializeData = implementation.interface.encodeFunctionData('initialize', initializeArgs)
+ const proxy = await ethers.deployContract('Proxy', [implementation, toAddress(initialOwner), initializeData])
+ return ethers.getContractAt(implementationName, proxy.target) as Promise
+}
diff --git a/packages/evm/test/safeguards/IntentsValidator.test.ts b/packages/evm/test/safeguards/OperationsValidator.test.ts
similarity index 51%
rename from packages/evm/test/safeguards/IntentsValidator.test.ts
rename to packages/evm/test/safeguards/OperationsValidator.test.ts
index ea4fd0a..d90cbbc 100644
--- a/packages/evm/test/safeguards/IntentsValidator.test.ts
+++ b/packages/evm/test/safeguards/OperationsValidator.test.ts
@@ -2,32 +2,34 @@ import { randomEvmAddress, randomHex } from '@mimicprotocol/sdk'
import { expect } from 'chai'
import { network } from 'hardhat'
-import { IntentsValidator } from '../../types/ethers-contracts/index.js'
+import { OperationsValidator } from '../../types/ethers-contracts/index.js'
import {
CallSafeguardMode,
- createCallIntent,
+ createCallOperation,
+ createCrossChainSwapOperation,
createDeniedAccountSafeguard,
createDeniedChainSafeguard,
createDeniedSelectorSafeguard,
+ createDynamicCallOperation,
createListSafeguard,
createOnlyAccountSafeguard,
createOnlyChainSafeguard,
createOnlySelectorSafeguard,
createSafeguardNone,
- createSwapIntent,
- createTransferIntent,
+ createSwapOperation,
+ createTransferOperation,
createTreeSafeguard,
SafeguardGroupLogic,
SwapSafeguardMode,
TransferSafeguardMode,
-} from '../helpers'
+} from '../helpers/index.js'
const { ethers } = await network.connect()
/* eslint-disable no-secrets/no-secrets */
-describe('IntentsValidator', () => {
- let validator: IntentsValidator
+describe('OperationsValidator', () => {
+ let validator: OperationsValidator
const CHAIN_LOCAL = 31337
const CHAIN_OTHER = 100
@@ -37,31 +39,30 @@ describe('IntentsValidator', () => {
const account2 = randomEvmAddress()
beforeEach('deploy contract', async () => {
- validator = await ethers.deployContract('IntentsValidator')
+ validator = await ethers.deployContract('OperationsValidator')
})
describe('List', () => {
describe('Swap modes', () => {
context('None', () => {
- const intent = createSwapIntent()
+ const operation = createSwapOperation()
const safeguard = createSafeguardNone()
- it('always reverts with IntentsValidatorNoneAllowed', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ it('always reverts with OperationsValidatorNoneAllowed', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorNoneAllowed'
+ 'OperationsValidatorNoneAllowed'
)
})
})
context('SourceChain', () => {
- const intent = createSwapIntent({ sourceChain: CHAIN_LOCAL, destinationChain: CHAIN_LOCAL })
-
+ const operation = createSwapOperation({ sourceChain: CHAIN_LOCAL, destinationChain: CHAIN_LOCAL })
context('when the source chain is not denied', () => {
const safeguard = createOnlyChainSafeguard(SwapSafeguardMode.SourceChain, CHAIN_LOCAL)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -69,9 +70,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedChainSafeguard(SwapSafeguardMode.SourceChain, CHAIN_LOCAL)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -80,22 +81,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyChainSafeguard(SwapSafeguardMode.SourceChain, CHAIN_OTHER)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('DestinationChain', () => {
- const intent = createSwapIntent({ sourceChain: CHAIN_LOCAL, destinationChain: CHAIN_LOCAL })
+ const operation = createSwapOperation({ sourceChain: CHAIN_LOCAL, destinationChain: CHAIN_LOCAL })
context('when the destination chain is allowed', () => {
const safeguard = createOnlyChainSafeguard(SwapSafeguardMode.DestinationChain, CHAIN_LOCAL)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -103,9 +104,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedChainSafeguard(SwapSafeguardMode.DestinationChain, CHAIN_LOCAL)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -114,22 +115,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyChainSafeguard(SwapSafeguardMode.DestinationChain, CHAIN_OTHER)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('TokenIn', () => {
- const intent = createSwapIntent({ tokensIn: [{ token: token1, amount: 1n }], tokensOut: [] })
+ const operation = createCrossChainSwapOperation({ tokensIn: [{ token: token1, amount: 1n }], tokensOut: [] })
context('when the token in is allowed', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.TokenIn, token1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -137,9 +138,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(SwapSafeguardMode.TokenIn, token1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -148,22 +149,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.TokenIn, token2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('TokenOut', () => {
- const intent = createSwapIntent({ tokensOut: [{ token: token1, minAmount: 0, recipient: account1 }] })
+ const operation = createSwapOperation({ tokensOut: [{ token: token1, minAmount: 0, recipient: account1 }] })
context('when the token out is allowed', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.TokenOut, token1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -171,9 +172,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(SwapSafeguardMode.TokenOut, token1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -182,22 +183,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.TokenOut, token2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('Recipient', () => {
- const intent = createSwapIntent({ tokensOut: [{ token: token1, minAmount: 0, recipient: account1 }] })
+ const operation = createSwapOperation({ tokensOut: [{ token: token1, minAmount: 0, recipient: account1 }] })
context('when the recipient is allowed', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.Recipient, account1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -205,9 +206,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(SwapSafeguardMode.Recipient, account1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -216,9 +217,9 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(SwapSafeguardMode.Recipient, account2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -227,25 +228,25 @@ describe('IntentsValidator', () => {
describe('Transfer modes', () => {
context('None', () => {
- const intent = createTransferIntent()
+ const operation = createTransferOperation()
const safeguard = createSafeguardNone()
- it('always reverts with IntentsValidatorNoneAllowed', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ it('always reverts with OperationsValidatorNoneAllowed', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorNoneAllowed'
+ 'OperationsValidatorNoneAllowed'
)
})
})
context('Chain', () => {
- const intent = createTransferIntent({ chainId: CHAIN_LOCAL, transfers: [] })
+ const operation = createTransferOperation({ chainId: CHAIN_LOCAL, transfers: [] })
context('when the chain is not denied', () => {
const safeguard = createOnlyChainSafeguard(TransferSafeguardMode.Chain, CHAIN_LOCAL)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -253,9 +254,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedChainSafeguard(TransferSafeguardMode.Chain, CHAIN_LOCAL)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -264,22 +265,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyChainSafeguard(TransferSafeguardMode.Chain, CHAIN_OTHER)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('Token', () => {
- const intent = createTransferIntent({ transfers: [{ token: token1, amount: 1n, recipient: account1 }] })
+ const operation = createTransferOperation({ transfers: [{ token: token1, amount: 1n, recipient: account1 }] })
context('when all tokens are not denied', () => {
const safeguard = createOnlyAccountSafeguard(TransferSafeguardMode.Token, token1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -287,9 +288,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(TransferSafeguardMode.Token, token1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -298,22 +299,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(TransferSafeguardMode.Token, token2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('Recipient', () => {
- const intent = createTransferIntent({ transfers: [{ token: token1, amount: 1n, recipient: account1 }] })
+ const operation = createTransferOperation({ transfers: [{ token: token1, amount: 1n, recipient: account1 }] })
context('when the recipient is allowed', () => {
const safeguard = createOnlyAccountSafeguard(TransferSafeguardMode.Recipient, account1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -321,9 +322,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(TransferSafeguardMode.Recipient, account1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -332,9 +333,9 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(TransferSafeguardMode.Recipient, account2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -346,25 +347,25 @@ describe('IntentsValidator', () => {
const target2 = randomEvmAddress()
context('None', () => {
- const intent = createCallIntent()
+ const operation = createCallOperation()
const safeguard = createSafeguardNone()
- it('always reverts with IntentsValidatorNoneAllowed', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ it('always reverts with OperationsValidatorNoneAllowed', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorNoneAllowed'
+ 'OperationsValidatorNoneAllowed'
)
})
})
context('Chain', () => {
- const intent = createCallIntent({ chainId: CHAIN_LOCAL, calls: [] })
+ const operation = createCallOperation({ chainId: CHAIN_LOCAL, calls: [] })
context('when the chain is not denied', () => {
const safeguard = createOnlyChainSafeguard(CallSafeguardMode.Chain, CHAIN_LOCAL)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -372,9 +373,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedChainSafeguard(CallSafeguardMode.Chain, CHAIN_LOCAL)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -383,22 +384,22 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyChainSafeguard(CallSafeguardMode.Chain, CHAIN_OTHER)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
})
context('Target', () => {
- const intent = createCallIntent({ calls: [{ target: target1, data: '0x', value: 0 }] })
+ const operation = createCallOperation({ calls: [{ target: target1, data: '0x', value: 0 }] })
context('when all targets are not denied', () => {
const safeguard = createOnlyAccountSafeguard(CallSafeguardMode.Target, target1)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -406,9 +407,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedAccountSafeguard(CallSafeguardMode.Target, target1)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -417,9 +418,9 @@ describe('IntentsValidator', () => {
const safeguard = createOnlyAccountSafeguard(CallSafeguardMode.Target, target2)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -427,13 +428,13 @@ describe('IntentsValidator', () => {
context('Selector', () => {
const selector = '0xa9059cbb'
- const intent = createCallIntent({ calls: [{ target: target1, data: selector, value: 0 }] })
+ const operation = createCallOperation({ calls: [{ target: target1, data: selector, value: 0 }] })
context('when the selector is allowed', () => {
const safeguard = createOnlySelectorSafeguard(selector)
it('passes', async () => {
- expect(await validator.validate(intent, createListSafeguard(safeguard))).to.not.be.reverted
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
})
})
@@ -441,9 +442,9 @@ describe('IntentsValidator', () => {
const safeguard = createDeniedSelectorSafeguard(selector)
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -452,9 +453,133 @@ describe('IntentsValidator', () => {
const safeguard = createOnlySelectorSafeguard(randomHex(4))
it('reverts', async () => {
- await expect(validator.validate(intent, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
validator,
- 'IntentsValidatorSafeguardFailed'
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+ })
+ })
+
+ describe('Dynamic call modes', () => {
+ const target1 = randomEvmAddress()
+ const target2 = randomEvmAddress()
+ const selector = '0xa9059cbb'
+
+ context('None', () => {
+ const operation = createDynamicCallOperation()
+ const safeguard = createSafeguardNone()
+
+ it('always reverts with OperationsValidatorNoneAllowed', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorNoneAllowed'
+ )
+ })
+ })
+
+ context('Chain', () => {
+ const operation = createDynamicCallOperation({ chainId: CHAIN_LOCAL, calls: [] })
+
+ context('when the chain is not denied', () => {
+ const safeguard = createOnlyChainSafeguard(CallSafeguardMode.Chain, CHAIN_LOCAL)
+
+ it('passes', async () => {
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
+ })
+ })
+
+ context('when the chain is denied', () => {
+ const safeguard = createDeniedChainSafeguard(CallSafeguardMode.Chain, CHAIN_LOCAL)
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+
+ context('when the chain is not allowed', () => {
+ const safeguard = createOnlyChainSafeguard(CallSafeguardMode.Chain, CHAIN_OTHER)
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+ })
+
+ context('Target', () => {
+ const operation = createDynamicCallOperation({
+ calls: [{ target: target1, selector, arguments: [], value: 0 }],
+ })
+
+ context('when all targets are not denied', () => {
+ const safeguard = createOnlyAccountSafeguard(CallSafeguardMode.Target, target1)
+
+ it('passes', async () => {
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
+ })
+ })
+
+ context('when the target is denied', () => {
+ const safeguard = createDeniedAccountSafeguard(CallSafeguardMode.Target, target1)
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+
+ context('when the target is not allowed', () => {
+ const safeguard = createOnlyAccountSafeguard(CallSafeguardMode.Target, target2)
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+ })
+
+ context('Selector', () => {
+ const operation = createDynamicCallOperation({
+ calls: [{ target: target1, selector, arguments: [], value: 0 }],
+ })
+
+ context('when the selector is allowed', () => {
+ const safeguard = createOnlySelectorSafeguard(selector)
+
+ it('passes', async () => {
+ expect(await validator.validate(operation, createListSafeguard(safeguard))).to.not.be.reverted
+ })
+ })
+
+ context('when the selector is denied', () => {
+ const safeguard = createDeniedSelectorSafeguard(selector)
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
+ )
+ })
+ })
+
+ context('when the selector is not allowed', () => {
+ const safeguard = createOnlySelectorSafeguard(randomHex(4))
+
+ it('reverts', async () => {
+ await expect(validator.validate(operation, createListSafeguard(safeguard))).to.be.revertedWithCustomError(
+ validator,
+ 'OperationsValidatorSafeguardFailed'
)
})
})
@@ -463,7 +588,7 @@ describe('IntentsValidator', () => {
})
describe('Tree', () => {
- const intent = createSwapIntent({
+ const operation = createSwapOperation({
sourceChain: CHAIN_LOCAL,
destinationChain: CHAIN_LOCAL,
tokensIn: [{ token: token1, amount: 1n }],
@@ -479,7 +604,7 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.AND, leaves: [0, 1], children: [] }]
it('passes', async () => {
- expect(await validator.validate(intent, createTreeSafeguard(groups, leaves))).to.not.be.reverted
+ expect(await validator.validate(operation, createTreeSafeguard(groups, leaves))).to.not.be.reverted
})
})
@@ -492,10 +617,9 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.AND, leaves: [0, 1], children: [] }]
it('reverts', async () => {
- await expect(validator.validate(intent, createTreeSafeguard(groups, leaves))).to.be.revertedWithCustomError(
- validator,
- 'IntentsValidatorSafeguardFailed'
- )
+ await expect(
+ validator.validate(operation, createTreeSafeguard(groups, leaves))
+ ).to.be.revertedWithCustomError(validator, 'OperationsValidatorSafeguardFailed')
})
})
})
@@ -510,7 +634,7 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.OR, leaves: [0, 1], children: [] }]
it('passes', async () => {
- expect(await validator.validate(intent, createTreeSafeguard(groups, leaves))).to.not.be.reverted
+ expect(await validator.validate(operation, createTreeSafeguard(groups, leaves))).to.not.be.reverted
})
})
@@ -523,10 +647,9 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.OR, leaves: [0, 1], children: [] }]
it('reverts', async () => {
- await expect(validator.validate(intent, createTreeSafeguard(groups, leaves))).to.be.revertedWithCustomError(
- validator,
- 'IntentsValidatorSafeguardFailed'
- )
+ await expect(
+ validator.validate(operation, createTreeSafeguard(groups, leaves))
+ ).to.be.revertedWithCustomError(validator, 'OperationsValidatorSafeguardFailed')
})
})
})
@@ -541,7 +664,7 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.XOR, leaves: [0, 1], children: [] }]
it('passes', async () => {
- expect(await validator.validate(intent, createTreeSafeguard(groups, leaves))).to.not.be.reverted
+ expect(await validator.validate(operation, createTreeSafeguard(groups, leaves))).to.not.be.reverted
})
})
@@ -554,10 +677,9 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.XOR, leaves: [0, 1], children: [] }]
it('reverts', async () => {
- await expect(validator.validate(intent, createTreeSafeguard(groups, leaves))).to.be.revertedWithCustomError(
- validator,
- 'IntentsValidatorSafeguardFailed'
- )
+ await expect(
+ validator.validate(operation, createTreeSafeguard(groups, leaves))
+ ).to.be.revertedWithCustomError(validator, 'OperationsValidatorSafeguardFailed')
})
})
@@ -566,10 +688,9 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.XOR, leaves: [0], children: [] }]
it('reverts', async () => {
- await expect(validator.validate(intent, createTreeSafeguard(groups, leaves))).to.be.revertedWithCustomError(
- validator,
- 'IntentsValidatorSafeguardFailed'
- )
+ await expect(
+ validator.validate(operation, createTreeSafeguard(groups, leaves))
+ ).to.be.revertedWithCustomError(validator, 'OperationsValidatorSafeguardFailed')
})
})
})
@@ -584,7 +705,7 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.NOT, leaves: [0, 1], children: [] }]
it('passes', async () => {
- expect(await validator.validate(intent, createTreeSafeguard(groups, leaves))).to.not.be.reverted
+ expect(await validator.validate(operation, createTreeSafeguard(groups, leaves))).to.not.be.reverted
})
})
@@ -594,10 +715,9 @@ describe('IntentsValidator', () => {
const groups = [{ logic: SafeguardGroupLogic.NOT, leaves: [0], children: [] }]
it('reverts', async () => {
- await expect(validator.validate(intent, createTreeSafeguard(groups, leaves))).to.be.revertedWithCustomError(
- validator,
- 'IntentsValidatorSafeguardFailed'
- )
+ await expect(
+ validator.validate(operation, createTreeSafeguard(groups, leaves))
+ ).to.be.revertedWithCustomError(validator, 'OperationsValidatorSafeguardFailed')
})
})
})
@@ -615,7 +735,7 @@ describe('IntentsValidator', () => {
]
it('passes', async () => {
- expect(await validator.validate(intent, createTreeSafeguard(groups, leaves))).to.not.be.reverted
+ expect(await validator.validate(operation, createTreeSafeguard(groups, leaves))).to.not.be.reverted
})
})
})
diff --git a/packages/evm/test/smart-accounts/SmartAccount7702.test.ts b/packages/evm/test/smart-accounts/SmartAccount7702.test.ts
index 772b1fe..2809623 100644
--- a/packages/evm/test/smart-accounts/SmartAccount7702.test.ts
+++ b/packages/evm/test/smart-accounts/SmartAccount7702.test.ts
@@ -5,7 +5,7 @@ import { Authorization } from 'ethers'
import { network } from 'hardhat'
import { CallMock, Controller, Settler, SmartAccount7702, TokenMock } from '../../types/ethers-contracts/index.js'
-import { Account, toAddress } from '../helpers'
+import { Account, deployProxy, toAddress } from '../helpers'
import { createCallIntent, createTransferIntent } from '../helpers/intents'
import { createCallProposal, createTransferProposal, signProposal } from '../helpers/proposal'
@@ -22,7 +22,11 @@ describe('SmartAccount7702', () => {
// eslint-disable-next-line prettier/prettier
[, admin, user, solver] = await ethers.getSigners()
controller = await ethers.deployContract('Controller', [admin, [solver], [], [admin], [], 0])
- settler = await ethers.deployContract('Settler', [controller, admin])
+ settler = await deployProxy(ethers, 'Settler', admin, [
+ controller.target,
+ admin.address,
+ randomEvmAddress(),
+ ])
smartAccount = await ethers.deployContract('SmartAccount7702', [settler])
})
@@ -56,11 +60,14 @@ describe('SmartAccount7702', () => {
const preUserTokenBalance = await balanceOf(token, user)
const preRecipientBalance = await balanceOf(token, recipient)
- const intent = createTransferIntent({ settler, user, transfers: [{ token, amount, recipient }] })
+ const intent = createTransferIntent(
+ { settler, feePayer: user },
+ { user, transfers: [{ token, amount, recipient }] }
+ )
const proposal = createTransferProposal()
const signature = await signProposal(settler, intent, solver, proposal, admin)
const options = { authorizationList: [authorization] }
- const tx = await settler.connect(solver).execute([{ intent, proposal, signature }], options)
+ const tx = await settler.connect(solver).execute(intent, proposal, signature, options)
const userSmartAccount = await ethers.getContractAt('ISmartAccount', user)
const userEvents = await userSmartAccount.queryFilter(smartAccount.filters.Transferred(), tx.blockNumber)
@@ -69,7 +76,7 @@ describe('SmartAccount7702', () => {
expect(userEvents[0].args.amount).to.be.equal(amount)
expect(userEvents[0].args.recipient.toLowerCase()).to.be.equal(recipient)
- const postUserTokenBalance = await balanceOf(token, intent.user)
+ const postUserTokenBalance = await balanceOf(token, intent.feePayer)
expect(preUserTokenBalance - postUserTokenBalance).to.be.eq(amount)
const postRecipientBalance = await balanceOf(token, recipient)
@@ -139,12 +146,15 @@ describe('SmartAccount7702', () => {
})
it('executes the intent', async () => {
- const intent = createCallIntent({ settler, user, calls: [{ target: target, data, value }] })
+ const intent = createCallIntent(
+ { settler, feePayer: user },
+ { user, calls: [{ target: target, data, value }] }
+ )
const proposal = createCallProposal()
const signature = await signProposal(settler, intent, solver, proposal, admin)
const options = { authorizationList: [authorization] }
- const tx = await settler.connect(solver).execute([{ intent, proposal, signature }], options)
+ const tx = await settler.connect(solver).execute(intent, proposal, signature, options)
const userSmartAccount = await ethers.getContractAt('ISmartAccount', user)
const userEvents = await userSmartAccount.queryFilter(smartAccount.filters.Called(), tx.blockNumber)
@@ -169,13 +179,13 @@ describe('SmartAccount7702', () => {
})
it('reverts', async () => {
- const intent = createCallIntent({ settler, user, calls: [{ target, data, value }] })
+ const intent = createCallIntent({ settler, feePayer: user }, { user, calls: [{ target, data, value }] })
const proposal = createCallProposal()
const signature = await signProposal(settler, intent, solver, proposal, admin)
const options = { authorizationList: [authorization] }
await expect(
- settler.connect(solver).execute([{ intent, proposal, signature }], options)
+ settler.connect(solver).execute(intent, proposal, signature, options)
).to.be.revertedWithCustomError(target, 'CallError')
})
})
diff --git a/packages/evm/test/smart-accounts/SmartAccountsHandlerHelpers.test.ts b/packages/evm/test/smart-accounts/SmartAccountsHandlerHelpers.test.ts
new file mode 100644
index 0000000..d98a9e8
--- /dev/null
+++ b/packages/evm/test/smart-accounts/SmartAccountsHandlerHelpers.test.ts
@@ -0,0 +1,75 @@
+import { randomEvmAddress } from '@mimicprotocol/sdk'
+import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/types'
+import { expect } from 'chai'
+import { AbiCoder } from 'ethers'
+import { network } from 'hardhat'
+
+import {
+ SmartAccountContract,
+ SmartAccountsHandler,
+ SmartAccountsHandlerHelpersMock,
+ StaticCallMock,
+} from '../../types/ethers-contracts/index.js'
+
+const { ethers } = await network.connect()
+
+describe('SmartAccountsHandlerHelpers', () => {
+ let helper: SmartAccountsHandlerHelpersMock
+ let handler: SmartAccountsHandler
+ let smartAccount: SmartAccountContract
+ let target: StaticCallMock
+ let owner: HardhatEthersSigner
+
+ beforeEach('setup signers', async () => {
+ // eslint-disable-next-line prettier/prettier
+ [, owner] = await ethers.getSigners()
+ })
+
+ beforeEach('deploy contracts', async () => {
+ // eslint-disable-next-line no-secrets/no-secrets
+ helper = await ethers.deployContract('SmartAccountsHandlerHelpersMock')
+ handler = await ethers.deployContract('SmartAccountsHandler')
+ smartAccount = await ethers.deployContract('SmartAccountContract', [helper, owner])
+ target = await ethers.deployContract('StaticCallMock')
+ })
+
+ describe('call', () => {
+ const itReturnsTheExpectedBytes = (
+ name: string,
+ args: unknown[],
+ types: string[],
+ expectedDecoded: unknown[]
+ ): void => {
+ it('returns the expected bytes', async () => {
+ const data = target.interface.encodeFunctionData(name, args)
+ const result = await helper.call.staticCall(handler, smartAccount, target, data, 0)
+ const expected = target.interface.encodeFunctionResult(name, args)
+
+ expect(result).to.equal(expected)
+ expect(AbiCoder.defaultAbiCoder().decode(types, result)).to.deep.equal(expectedDecoded)
+ })
+ }
+
+ context('when returning a uint256', () => {
+ itReturnsTheExpectedBytes('returnUint', [11n], ['uint256'], [11n])
+ })
+
+ context('when returning a dynamic array', () => {
+ const dynamicArray = [11n, 22n, 33n]
+
+ itReturnsTheExpectedBytes('returnArray', [dynamicArray], ['uint256[]'], [dynamicArray])
+ })
+
+ context('when returning a fixed-length array', () => {
+ const fixedArray = [44n, 55n, 66n]
+
+ itReturnsTheExpectedBytes('returnFixedArray', [fixedArray], ['uint256[3]'], [fixedArray])
+ })
+
+ context('when returning a struct', () => {
+ const struct = { a: 77n, b: randomEvmAddress() }
+
+ itReturnsTheExpectedBytes('returnStruct', [struct], ['tuple(uint256 a,address b)'], [[struct.a, struct.b]])
+ })
+ })
+})
diff --git a/packages/evm/test/utils/BytesHelpers.test.ts b/packages/evm/test/utils/BytesHelpers.test.ts
new file mode 100644
index 0000000..6ca2db2
--- /dev/null
+++ b/packages/evm/test/utils/BytesHelpers.test.ts
@@ -0,0 +1,143 @@
+import { expect } from 'chai'
+import { AbiCoder } from 'ethers'
+import { network } from 'hardhat'
+
+import { BytesHelpersMock } from '../../types/ethers-contracts/index.js'
+
+const { ethers } = await network.connect()
+
+/* eslint-disable no-secrets/no-secrets */
+
+describe('BytesHelpers', () => {
+ let library: BytesHelpersMock
+
+ beforeEach('deploy helpers mock', async () => {
+ library = await ethers.deployContract('BytesHelpersMock')
+ })
+
+ describe('readWord0', () => {
+ context('when data is 32 bytes', () => {
+ const word = 123n
+ const data = AbiCoder.defaultAbiCoder().encode(['uint256'], [word])
+
+ it('returns the first word', async () => {
+ expect(await library.readWord0(data)).to.equal(word)
+ })
+ })
+
+ context('when data is longer than 32 bytes', () => {
+ const a = 999n
+ const b = 555n
+ const data = AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256'], [a, b])
+
+ it('returns the first word', async () => {
+ expect(await library.readWord0(data)).to.equal(a)
+ })
+ })
+ })
+
+ describe('readWord1', () => {
+ context('when data is 64 bytes', () => {
+ const a = 999n
+ const b = 555n
+ const data = AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256'], [a, b])
+
+ it('returns the second word', async () => {
+ expect(await library.readWord1(data)).to.equal(b)
+ })
+ })
+
+ context('when data is longer than 64 bytes', () => {
+ const a = 999n
+ const b = 555n
+ const c = 111n
+ const data = AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256', 'uint256'], [a, b, c])
+
+ it('returns the second word', async () => {
+ expect(await library.readWord1(data)).to.equal(b)
+ })
+ })
+ })
+
+ describe('slice(bytes)', () => {
+ const data = '0x00112233445566778899aabbccddeeff'
+
+ context('when slicing the full range', () => {
+ it('returns the same bytes', async () => {
+ const out = await library.slice(data, 0, (data.length - 2) / 2)
+ expect(out).to.equal(data)
+ })
+ })
+
+ context('when slicing a middle range', () => {
+ it('returns the expected bytes', async () => {
+ const out = await library.slice(data, 2, 6)
+ expect(out).to.equal('0x22334455')
+ })
+ })
+
+ context('when slicing an empty range', () => {
+ it('returns empty bytes', async () => {
+ const out = await library.slice(data, 5, 5)
+ expect(out).to.equal('0x')
+ })
+ })
+
+ context('when end is smaller than start', () => {
+ it('reverts', async () => {
+ await expect(library.slice(data, 6, 2)).to.be.revertedWithCustomError(library, 'BytesLibSliceOutOfBounds')
+ })
+ })
+
+ context('when end is out of bounds', () => {
+ it('reverts', async () => {
+ const len = (data.length - 2) / 2
+ await expect(library.slice(data, 0, len + 1)).to.be.revertedWithCustomError(library, 'BytesLibSliceOutOfBounds')
+ })
+ })
+
+ context('when start equals length and end equals length', () => {
+ it('returns empty bytes', async () => {
+ const len = (data.length - 2) / 2
+ const out = await library.slice(data, len, len)
+ expect(out).to.equal('0x')
+ })
+ })
+ })
+
+ describe('sliceFrom', () => {
+ const data = '0x00112233445566778899aabbccddeeff'
+
+ context('when start is 0', () => {
+ it('returns the same bytes', async () => {
+ const out = await library.sliceFrom(data, 0)
+ expect(out).to.equal(data)
+ })
+ })
+
+ context('when start is in the middle', () => {
+ it('returns the expected bytes', async () => {
+ const out = await library.sliceFrom(data, 4)
+ expect(out).to.equal('0x445566778899aabbccddeeff')
+ })
+ })
+
+ context('when start equals length', () => {
+ it('returns empty bytes', async () => {
+ const len = (data.length - 2) / 2
+ const out = await library.sliceFrom(data, len)
+ expect(out).to.equal('0x')
+ })
+ })
+
+ context('when start is out of bounds', () => {
+ it('reverts', async () => {
+ const len = (data.length - 2) / 2
+ await expect(library.sliceFrom(data, len + 1)).to.be.revertedWithCustomError(
+ library,
+ 'BytesLibSliceOutOfBounds'
+ )
+ })
+ })
+ })
+})
diff --git a/yarn.lock b/yarn.lock
index 70bafcf..b55b7a7 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -48,7 +48,7 @@
resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.31.1.tgz#d635cbac2533973ae6bfb5d3ba1de89ce5aece2d"
integrity sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==
-"@coral-xyz/anchor@^0.32.1":
+"@coral-xyz/anchor@0.32.1", "@coral-xyz/anchor@^0.32.1":
version "0.32.1"
resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.32.1.tgz#a07440d9d267840f4f99f1493bd8ce7d7f128e57"
integrity sha512-zAyxFtfeje2FbMA1wzgcdVs7Hng/MijPKpRijoySPCicnvcTQs/+dnPZ/cR+LcXM9v9UYSyW81uRNYZtN5G4yg==
@@ -482,11 +482,12 @@
wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
-"@mimicprotocol/sdk@0.0.1-rc.20":
- version "0.0.1-rc.20"
- resolved "https://registry.yarnpkg.com/@mimicprotocol/sdk/-/sdk-0.0.1-rc.20.tgz#a2a29c53b17901c38c25e39304ddcf46a72058f2"
- integrity sha512-Hdw9jvyVI3ox6SbY/AI22yi55gDlf1Qx33UHdN1jCR+IL350rHBKO2b+L2zvSYIH4mcJWhXAofREM4zwKuqVBw==
+"@mimicprotocol/sdk@~0.1.0":
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/@mimicprotocol/sdk/-/sdk-0.1.0.tgz#a0bb3661cd0129bac253cba6c79dea7b6026b44e"
+ integrity sha512-wJqjsZC9qQOKi5j7rOutCSHg9aV1/Sg8+nMaLt0IX/z5P1Dk2BBFb8OJc1q1MFW9PZOAJSaFhtZlRxKkzhoopA==
dependencies:
+ "@coral-xyz/anchor" "0.32.1"
"@solana/web3.js" "^1.98.4"
borsh "^2.0.0"
cron-parser "^5.3.1"
@@ -779,6 +780,11 @@
"@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2"
"@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2"
+"@openzeppelin/contracts-upgradeable@5.3.0":
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.3.0.tgz#79dba09ab0b4bb49f21544ea738b9de016b0ceea"
+ integrity sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg==
+
"@openzeppelin/contracts@5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.3.0.tgz#0a90ce16f5c855e3c8239691f1722cd4999ae741"